在CARRIAGECONTROL =中使用gfortran的OPEN语句中的语法错误

时间:2017-11-27 02:02:30

标签: compilation fortran cygwin

当我尝试使用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

如何解决这些问题?

1 个答案:

答案 0 :(得分:1)

第一个错误可能意味着该行太长。固定表单源只允许72个字符的长行。您可以使用-ffixed-line-length-n之类的特殊标记来使用更多内容,其中n是一个数字。您可以-ffixed-line-length-0使用无限长度。这个网站上有很多类似的问题。

CARRIAGECONTROL=语句中的OPEN说明符不是标准的。 从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说明符   CARRIAGECONTROL,READONLY和SHARE以及编译标志-fdec,for   兼容性。

     

CARRIAGECONTROL

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

说明符对readonly文件没有意义。当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还不够。