fortran WRITE和FORMAT似乎不需要在intel编译器上确认

时间:2013-04-29 14:52:07

标签: fortran gfortran

我正在编译一个已知使用ifortgfortran进行编译的程序。但是,编译器在行

上失败
WRITE (11,1325) ((IFILE,FILENAME(IFILE)),IFILE=1,IFILES)    

编译错误:

main_file.f:205.32:

     WRITE (11,1325) ((IFILE,FILENAME(IFILE)),IFILE=1,IFILES)       
                            1
Error: Expected PARAMETER symbol in complex constant at (1)
make: *** [main_file.o] Error 1

将此行更改为(注意删除'('和')')

WRITE (11,1480) (IFILE,FILENAME(IFILE),IFILE=1,IFILES)    

匹配后续行

1480      FORMAT (1X,I1,' ',A40)

解决了这个问题,但我想知道是否有人可能知道为什么英特尔编译器没有捕获到这个错误。在这种情况下,它似乎是gfortran给出了正确的行为。我的编译标志是:

gfortran -fno-automatic -mcmodel=medium -O2 -ffast-math  main_file.o -o main_file 

2 个答案:

答案 0 :(得分:1)

正如其他人在最近的类似问题中发布的那样,由于其传统,英特尔编译器默认允许多个扩展。如果您提供适当的标准检查选项(例如,在Windows上为/stand),编译器将发出诊断信息。

我不确定这个特定扩展的具体来源,但它涵盖了一些偶然的语法误解,人们会把“参数”放在括号中写或读“函数”......

READ (*,*) (not_valid_syntax)

(在一个写语句中,括号中的表达式本身就是一个表达式,这是一个有效的输出列表项 - 几年前英特尔编译器会对此感到有点困惑。)

答案 1 :(得分:0)

非常有趣的问题。它仅适用于数组:

 print *, ((1,["a","b"]),i=1,10)
end

有效,但

 print *, ((1,"a"),i=1,10)
end
使用ifort

失败

: error #6063: An INTEGER or REAL data type is required in this context.   ['a']
 print *, ((1,"a"),i=1,10)

上帝知道解析器在第一个工作案例中认为它是什么,也许是一个不完整的嵌套暗示吗?当然,它不是合法的Fortran语法,应该由编译器拒绝,这需要标准的Fortran。英特尔可能有理由接受这种语法。