0

[注意:包含上一个问题的重复,但作为单独的问题单独发布]

我正在编译一个已知可以使用 gfortran 用 ifort 编译的程序。但是编译器失败了

PARAMETER (POS='^')  

编译错误:

conv_prof.mac:9.21:
    Included at conv_prof.f:811:

      PARAMETER (POS='^')                                               
                 1
Error: Can't convert CHARACTER(1) to REAL(4) at (1)
make: *** [conv_prof.o] Error 1

事实证明没有使用 POS 参数(它可能是一个遗留参数)所以我可以简单地取消注释这一行来编译,但我想知道是否有人可能知道为什么这是 gfortran 而不是 ifort 中的问题?

干杯,

德里克

4

2 回答 2

3

英特尔编译器是一长串 Fortran 编译器的后代。它的祖先实现了各种非标准行为,并且本着 Fortran 的真正精神,最新版本的编译器应该编译最古老的代码。您通常可以ifort通过明智地使用编译器标志来警告代码中的非标准功能。

另一方面,gfortran(默认情况下)不接受很多非标准语法,除了那些广泛使用的非标准语法形式,许多毫无戒心的程序员认为它们是标准形式(例如real*4等)。

在我看来,您的片段来自 FORTRAN77 之前的日子,当时该语言并未真正承认存在诸如非数字变量之类的新奇想法。在这种情况下,我建议您遵循 gfortran 禁止此代码,而不是 Intel Fortran。

于 2013-04-29T14:49:45.007 回答
2

这里的具体扩展是,ifort 允许程序将字符值“分配”到真实对象中。也许它打算使用此扩展 - 但更可能的解释是pos在 PARAMETER 语句之前缺少参数的类型声明语句。

从技术上讲,我认为标准在这种情况下不需要诊断(这不违反标准的语法规则或约束 - 它违反了正文中对程序的要求),但是你如果您打开标准检查(/stand-stand,取决于您的平台),将从 ifort 获得诊断。

于 2013-04-29T21:03:02.760 回答