当我尝试使用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
如何解决这些问题?
答案 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还不够。