Compilation 控件处带有gfortran的OPEN语句中出现语法错误=
当我试图使用Cygwin编译名为“zone_b.f”的Fortran源文件以生成可执行程序时,遇到了一些错误 Fortran文件是从web下载的。准确的代码可以从中查看 当我尝试使用以下命令进行编译时,会产生以下错误:Compilation 控件处带有gfortran的OPEN语句中出现语法错误=,compilation,fortran,cygwin,Compilation,Fortran,Cygwin,当我试图使用Cygwin编译名为“zone_b.f”的Fortran源文件以生成可执行程序时,遇到了一些错误 Fortran文件是从web下载的。准确的代码可以从中查看 当我尝试使用以下命令进行编译时,会产生以下错误: $ gfortran zone_b.f zone_b.f:54:72: call getzone(zone_start, zone_end, selection_on, line(3:76))
$ gfortran zone_b.f
zone_b.f:54:72:
call getzone(zone_start, zone_end, selection_on, line(3:76))
1
Error: Syntax error in SUBSTRING specification at (1)
zone_b.f:61:28:
& form='FORMATTED', carriagecontrol='LIST',
1
Error: Syntax error in OPEN statement at (1)
我怀疑这是因为Fortran文件的格式较旧,但当我尝试从下载的g77编译器时
我遇到另一个问题:
C:\F\York>g77 zone_b.f -o zone_b.exe
zone_b.f: In program `zone_b':
zone_b.f:60:
open(5, status='OLD', file=line,
^
Unsupported OPEN control item at (^) -- ACTION=, ASSOCIATEVARIABLE=,
BLOCKSIZE=, BUFFERCOUNT=, CARRIAGECONTROL=, DEFAULTFILE=, DELIM=, DISPOSE=,
EXTENDSIZE=, INITIALSIZE=, KEY=, MAXREC=, NOSPANBLOCKS, ORGANIZATION=, PAD=,
POSITION=, READONLY=, RECORDTYPE=, SHARED=, and USEROPEN= are not supported
如何解决这些问题?第一个错误可能意味着线路太长。固定格式源只允许72个字符的长行。您可以使用更多特殊标志,如
-ffix-line-length-n
,其中n
是一个数字。您可以使用-ffix-line-length-0
实现无限长度。这个网站上有很多类似的问题
OPEN
语句中的careecontrol=
说明符不是标准的。
可以从open语句中删除它。我当然会为我自己的代码这样做
即第60-62行:
open(5, status='OLD', file=line,
& form='FORMATTED', carriagecontrol='LIST',
& READONLY, err=400)
可以改为
open(5, status='OLD', file=line,
& form='FORMATTED', err=400)
代码将在gfortran的旧版本中编译(我尝试了4.8到6)
您还可以添加ACTION=“read”
,但这并不是必需的。请注意,在单元5中打开外部文件是不可取的,因为该单元通常预先连接到标准输入,但现在无关紧要
对于其他人的代码,正如tim18在评论中指出的,当前的gfortran版本确实支持这些扩展。但是,必须使用
-fdec
启用它们,默认情况下不会启用它们
从:
GNU Fortran支持额外的遗留I/O说明符
CARECARECONTROL、READONLY和与编译标志-fdec共享,用于
兼容性
车厢控制
The CARRIAGECONTROL specifier allows a user to control line termination settings between output records for an I/O unit. The
说明符对只读文件没有意义。当CARRAIGECONTROL
打开格式化写入单元时指定的
控制设置决定要在哪些字符之间写入
输出记录。语法是:
OPEN(..., CARRIAGECONTROL=cc)
Where cc is a character expression that evaluates to one of the following values:
'LIST' One line feed between records (default)
'FORTRAN' Legacy interpretation of the first character (see below)
'NONE' No separator between recordsg
我下载了文件。太可怕了。在固定格式Fortran中,不要使用制表符而不是空格。真的不要!这个文件是一个糟糕的例子 但它确实使用我已经提到的两个选项编译:
gfortran-7-fdec-ffixed-line-length-0区域\u b.f
你报告的错误就会消失
您需要gfortran版本7!版本6还不够。当前的gfortran支持传统的车厢控制扩展,但检查设置的有效性。StackOverflow中存在非常类似的问题,但OPEN语句中的各个说明符不同。我们或许应该以某种方式将它们统一起来。并使用gfortran中新的可能支持对其进行更新。您认为我们是否应该对所有这些选项提出一个规范问题,并将其他问题标记为重复问题?子字符串规范错误可能是因为行太长。(我查看了源代码,但没有实际计算列数…)@agentp这看起来很有可能,错误消息显示第54行第72列。我试图将-fdec包含到命令中,但仍然有相同的错误。$gfortran zone_b.f-fdecIt仅在最新版本的gfortran中受支持。您必须告诉我们您有哪个版本。$gfortran--GNU Fortran版本GNU Fortran(GCC)6.4.0我应该在哪里包括-ffix-line-length-0?我使用命令行$gfortran-ffix-line-length-0 zone_b.f-fdec。这给我留下了第一个错误:OPEN语句中的语法错误。