首页 > 解决方案 > 编译旧的 Fortran 代码时出现语法错误

问题描述

我正在使用某人的 Fortran 脚本,我对此进行了一些更改。现在我在执行它时遇到语法错误。我是 Fortran 新手,所以无法弄清楚。

代码如下:

integer  i_canorg
integer  i
integer  n
integer  canorg(n)
real  r1demdoms(n)
real  r1supdoms(n)
real  r1supdomcan(n)
real  r1rivout(n)
real  r1envflw(n)

if(canorg(i).ne.0)then
  i0l_canorg=canorg(i)
  call calc_supcan1(i_canorg,r1demdoms(i),r1supdoms(i),r1rivout(i_canorg),r1envflw(i_canorg),r1supdomcan(i))    
end if

代码很长,我另外添加了if命令和i_canorg参数。

运行代码时出现以下错误:


  348 |      call calc_supcan1(i0lcanorg,r1demdoms(i),r1supdoms(i),r1rivout(i_canorg),r1envflw(i_canorg),r1supdomcan(i))
      |                                                                        1
Error: Syntax error in argument list at (1)

此语法错误背后的原因是什么?

标签: fortransyntax-error

解决方案


程序未编译的原因是该行太长,不幸的是您的编译器错误无助于弄清楚这一点。致命的赠品是,包括错误消息中行首的六个空格,错误消息1中的第 73 列。您的编译器正在以固定源格式解释源代码,这有一些非常特殊的要求:有关完整的详细信息,请参阅N1191 的第 3.3.2 节

您的编译器应该有一个选项来指定您的源代码应该以免费源代码的形式解释。根据您的错误消息,您最有可能使用具有命令行选项的 gfortran -ffree-line-length-[n]检查文档并将其设置为适合您的源代码的值。

如果您希望继续使用固定源格式,则必须将该行分成多行,并在每行的第六列中添加一个续行符。该字符可以是除空格 ( ) 或零 ( 0) 以外的任何字符,如果它位于注释行(以字母C或星号 ( *) 开头的行)中,则该字符将被忽略。这是修复线路的一种可能方法:

****** <- note the six special columns at the beginning of the line
      call calc_supcan1(i_canorg,r1demdoms(i),r1supdoms(i),
     > r1rivout(i_canorg),r1envflw(i_canorg),r1supdomcan(i))

推荐阅读