gfortran 不允许具有不同组件长度的字符数组

Posted

技术标签:

【中文标题】gfortran 不允许具有不同组件长度的字符数组【英文标题】:gfortran does not allow character arrays with varying component lengths 【发布时间】:2014-02-28 10:03:21 【问题描述】:

请看下面的例子

 program test

 character(10),dimension(5):: models = (/"feddes.swp", "jarvis89.swp", "jarvis10.swp" ,   "pem.swp", "van.swp"/)

end

返回如下错误:

(1) 处的数组构造函数中的不同字符长度 (10/12)

ifort 编译器没有错误。为什么 gfortran 会出现这种情况,有什么办法可以规避这个问题?

【问题讨论】:

错误是关于右手边。数组构造函数中的字符必须具有相同的长度,或者必须在构造函数的开头指定长度(仅在 F2003 中可用)。 LHS 无关紧要。 感谢您的解释,但是您知道为什么 ifort 编译器会毫无错误地接受我发布的示例吗? @MarcosAlex 我对 F2008 的解读是编译器不需要诊断代码中的错误。这可能只是一个有用的扩展。 【参考方案1】:

ifort 接受原始代码,但它不是标准的 fortran,因此来自 gfortran 的错误。如果您向 ifort 提供选项 -std,它将在编译器允许此类扩展时打印警告。

【讨论】:

【参考方案2】:

您在构造函数中有一些长度为 12,因此使用长度 12 可能会更好。

另外,改用

character(len=12), dimension(5) :: models = [character(len=12) :: "feddes.swp", &
                "jarvis89.swp", "jarvis10.swp", "pem.swp", "van.swp"]

如果你有编译器支持,可能会更好

character(len=*), dimension(*) :: ...

【讨论】:

好,我不知道这种字符语法。 你们展示了,正如 Vladimir F 所建议的那样,如何在构造函数的开头指定长度。不过,我想知道:为什么 ifort 接受(编译中没有错误或警告)我发布的示例? 编译器可能需要能够检测代码中的错误,但您可能有一个标志可以让它更轻松。试试-warn all。也就是说,除非您禁止,否则它可能会接受它作为扩展。 我按照你的建议做了,但没有显示任何警告。此外,当我执行打印向量的值时,它表现良好。它似乎有一些不符合标准的东西

以上是关于gfortran 不允许具有不同组件长度的字符数组的主要内容,如果未能解决你的问题,请参考以下文章

长度参数化的传递对象到类型绑定过程有 gfortran 抱怨

Scala,强制数组/集合参数的长度

我有一个基于所选城市长度不同的对象数组。如何选择包含具有特定属性的对象的元素?

OpenCL中不允许使用可变长度数组声明 - 为什么?

具有不同长度数组的熊猫

MIXED_STR_LEN_ARG 与 gfortran