Compilation 控件处带有gfortran的OPEN语句中出现语法错误=

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))

当我试图使用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))
                                                                    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语句中的语法错误。