【问题标题】:Syntax error in OPEN statement with gfortran at CARRIAGECONTROL=在 CARRIAGECONTROL= 处使用 gfortran 的 OPEN 语句中的语法错误
【发布时间】:2017-11-27 02:02:30
【问题描述】:

当我尝试使用 Cygwin 编译名为“zone_b.f”的 Fortran 源文件以生成可执行程序时遇到一些错误。

Fortran 文件是从网上下载的。具体代码可以在here查看。

当我尝试使用以下命令进行编译时,会产生以下错误:

$ 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 文件是旧格式,但是当我尝试从 this website 下载的 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

我该如何解决这些问题?

【问题讨论】:

  • 当前 gfortran 支持旧的回车控制扩展,但会检查设置的有效性。
  • StackOverflow 上有非常相似的问题,但针对 OPEN 语句中的不同个别说明符。我们或许应该以某种方式统一它们。并使用 gfortran 中可能的新支持更新它们。
  • 您认为我们应该对所有这些选项提出一个规范问题,并将其他问题标记为重复吗?
  • SUBSTRING 规范错误可能是行太长的结果。 (我查看了源代码,但实际上并没有计算列数..)
  • @agentp 这看起来很有可能,错误消息显示第 54 行第 72 列。

标签: compilation fortran cygwin


【解决方案1】:

第一个错误可能意味着该行太长。固定格式源代码只允许 72 个字符长的行。你可以使用更多的特殊标志,比如-ffixed-line-length-n,其中n 是一个数字。您可以使用-ffixed-line-length-0 无限长度。这个网站上有很多类似的问题。


OPEN 语句中的 CARRIAGECONTROL= 说明符不是标准的。 从 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 启用它们,默认情况下不会启用它们。

来自manual

GNU Fortran 支持额外的传统 I/O 说明符 带有编译标志 -fdec 的 CARRIAGECONTROL、READONLY 和 SHARE,用于 兼容性。

运输控制

The CARRIAGECONTROL specifier allows a user to control line termination settings between output records for an I/O unit. The

说明符对只读文件没有意义。当 CARRAIGECONTROL 是 在打开一个单元进行格式化写入时指定,确切的 CARRIAGECONTROL 设置确定要写入的字符之间 输出记录。语法是:

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 zone_b.f

您报告的错误就会消失。

需要 gfortran 版本 7!版本 6 还不够。

【讨论】:

  • 我尝试将 -fdec 包含在我的命令中,但仍然出现相同的错误。 $ gfortran zone_b.f -fdec
  • 它仅在最新版本的 gfortran 中受支持。你必须告诉我们你有哪个版本。
  • $ gfortran --version GNU Fortran GNU Fortran (GCC) 6.4.0
  • 我应该在哪里包含-fixed-line-length-0?
  • 我使用命令行 $ gfortran -ffixed-line-length-0 zone_b.f -fdec。它给我留下了第一个错误:OPEN 语句中的语法错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 2015-05-25
  • 2013-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-15
相关资源
最近更新 更多