英特尔编译器 returns "Found Format_element when Expected end of statement"
Intel Compiler returns "Found Format_element when Expected end of statement"
如下我练习定型Fortran的代码所示(因为我要学习的代码是定型Fortran),新增第4条格式语句和从文件1中读取。在添加这些语句之前代码按预期工作,但现在没有附加标志的英特尔 ifort 编译器将不会编译第 4 条格式语句和 returns 以下错误:
fortPractice.for(18): error #5082: Syntax error, found FORMAT_ELEMENT 'format' when expecting one of: <END-OF-STATEMENT> ;
4 format(i6,2x)
--------------^
fortPractice.for(26): error #6052: This label has not been defined as a FORMAT label.
write(2,3)
----------------------------------^
密码是:
c This is a script for practicing Fortran codes
program fortPractice
implicit none
integer :: x(0:5),y(2:7)
integer :: nph(1:6)
real :: z(4:9)
integer :: i
OPEN(unit=1,file='test.txt',status='old')
read(1,*) nph
close(unit=1)
open(unit = 2, file = 'output.txt')
2 format(i3,2x,i3,2x,2e11.2)
3 format(1x,78('*'))
4 format(i6,2x)
do i = 0,5
x(i) = i;
y(i+2) = i+2;
z(i+4) = x(i)**2 + y(i+2)**2
z(i+4) = sqrt(z(i+4)) + 10000
write(2,2) x(i),y(i+2),z(i+4)
write(2,3)
enddo
write(2,*) nph
close(unit = 2)
endprogram fortPractice
输出是由程序创建的文件。 test.txt 只包含一行数字:1 2 3 4 5 6
当我注释或删除第 4 条格式语句时,代码会按预期进行编译和 运行s。因为我只是在学习固定形式的 Fortran 是如何工作的,所以我只对第 4 种格式语句无法编译的原因感兴趣。
编辑:
我用空格替换了所有制表符,下面显示的经过更多修改的程序现在可以编译,但程序不生成输出文件,可能遇到一些 运行-time 错误:
编辑 2:
没关系,我忘了更改文件标识符。
谢谢大家!
现在我们有足够的信息来解决这个问题。在麻烦的源代码行中,标签 4 前面有一个制表符。 Fortran 源代码中的选项卡不是标准的,但英特尔 Fortran(和许多其他编译器)支持称为 "tab source form" 的东西。它在ifort中的工作方式如下:
- 如果该行以制表符开头,然后是非零数字,则该数字被视为在第 6 列中
- 如果该行以制表符开头,然后是其他字符,则该字符将被视为在第 7 列中
- 如果该行以数字语句标签开始,然后是制表符,则下一个字符将被视为在第 7 列中
- 否则,制表符将被视为空白(这最后一个因编译器而异)
在您的例子中,制表符位于 4 之前,因此它被认为是上一行的延续,从而导致错误。要么不使用制表符,要么了解编译器如何处理它们。自动插入标签的编辑器只会给你带来麻烦。
如下我练习定型Fortran的代码所示(因为我要学习的代码是定型Fortran),新增第4条格式语句和从文件1中读取。在添加这些语句之前代码按预期工作,但现在没有附加标志的英特尔 ifort 编译器将不会编译第 4 条格式语句和 returns 以下错误:
fortPractice.for(18): error #5082: Syntax error, found FORMAT_ELEMENT 'format' when expecting one of: <END-OF-STATEMENT> ;
4 format(i6,2x)
--------------^
fortPractice.for(26): error #6052: This label has not been defined as a FORMAT label.
write(2,3)
----------------------------------^
密码是:
c This is a script for practicing Fortran codes
program fortPractice
implicit none
integer :: x(0:5),y(2:7)
integer :: nph(1:6)
real :: z(4:9)
integer :: i
OPEN(unit=1,file='test.txt',status='old')
read(1,*) nph
close(unit=1)
open(unit = 2, file = 'output.txt')
2 format(i3,2x,i3,2x,2e11.2)
3 format(1x,78('*'))
4 format(i6,2x)
do i = 0,5
x(i) = i;
y(i+2) = i+2;
z(i+4) = x(i)**2 + y(i+2)**2
z(i+4) = sqrt(z(i+4)) + 10000
write(2,2) x(i),y(i+2),z(i+4)
write(2,3)
enddo
write(2,*) nph
close(unit = 2)
endprogram fortPractice
输出是由程序创建的文件。 test.txt 只包含一行数字:1 2 3 4 5 6
当我注释或删除第 4 条格式语句时,代码会按预期进行编译和 运行s。因为我只是在学习固定形式的 Fortran 是如何工作的,所以我只对第 4 种格式语句无法编译的原因感兴趣。
编辑: 我用空格替换了所有制表符,下面显示的经过更多修改的程序现在可以编译,但程序不生成输出文件,可能遇到一些 运行-time 错误:
编辑 2: 没关系,我忘了更改文件标识符。
谢谢大家!
现在我们有足够的信息来解决这个问题。在麻烦的源代码行中,标签 4 前面有一个制表符。 Fortran 源代码中的选项卡不是标准的,但英特尔 Fortran(和许多其他编译器)支持称为 "tab source form" 的东西。它在ifort中的工作方式如下:
- 如果该行以制表符开头,然后是非零数字,则该数字被视为在第 6 列中
- 如果该行以制表符开头,然后是其他字符,则该字符将被视为在第 7 列中
- 如果该行以数字语句标签开始,然后是制表符,则下一个字符将被视为在第 7 列中
- 否则,制表符将被视为空白(这最后一个因编译器而异)
在您的例子中,制表符位于 4 之前,因此它被认为是上一行的延续,从而导致错误。要么不使用制表符,要么了解编译器如何处理它们。自动插入标签的编辑器只会给你带来麻烦。