Compiler errors 如何编译这个旧的Fortran代码?

Compiler errors 如何编译这个旧的Fortran代码?,compiler-errors,fortran,gfortran,Compiler Errors,Fortran,Gfortran,我正在尝试编译Fortran代码,这些代码是80年代末在DEC操作系统上编写和编译的。我不确定代码是用什么版本的Fortran编写的 我使用的是macOS版本10.14.6,使用的是gfortran版本8.2.0 当我尝试使用以下命令行进行编译时: gfortran-v-fdec-o测试代码 我收到以下错误: CODE.FOR:1618:72: CODE.FOR: 1599:72: CODE.FOR:1618.72: Error: Variable 'j' at (1) cannot be

我正在尝试编译Fortran代码,这些代码是80年代末在DEC操作系统上编写和编译的。我不确定代码是用什么版本的Fortran编写的

我使用的是macOS版本10.14.6,使用的是gfortran版本8.2.0

当我尝试使用以下命令行进行编译时:

gfortran-v-fdec-o测试代码

我收到以下错误:

CODE.FOR:1618:72:

CODE.FOR: 1599:72:

CODE.FOR:1618.72:

Error: Variable 'j' at (1) cannot be redefined inside loop beginning at (2)
当我看第1618行时,我看到:J=J-1,它位于DO循环中

这段代码是否太旧,以至于以前在旧编译器上编译,但现在在gfortran上,它不允许在DO循环中更改变量j


您正在更改循环的迭代变量J

DO 10 J=1,NMAX

这是不允许的

您可以轻松地将任何索引DO循环重写为非索引DO循环

     DO 10 J=1,NMAX

         if (..) J = J - 1
     10 CONTINUE
变成

     J = 1
     DO

         if (..) J = J - 1

         J = J + 1

         if (J > NMAX) exit
     END DO


您正在更改循环的迭代变量J

DO 10 J=1,NMAX

这是不允许的

您可以轻松地将任何索引DO循环重写为非索引DO循环

     DO 10 J=1,NMAX

         if (..) J = J - 1
     10 CONTINUE
变成

     J = 1
     DO

         if (..) J = J - 1

         J = J + 1

         if (J > NMAX) exit
     END DO


我们真的需要看看代码。但是,您可能必须更正代码以符合标准。你的代码不是有效的Fortran,在80年代也不是有效的Fortran。但是如果它按照你说的那样做,代码就被破坏了——这在标准Fortran中是不允许的。您必须找到一个编译器,然后将其作为扩展提供—我不知道有哪一个。@VladimirF我共享代码的最佳方式是什么?此网站上的代码应始终复制粘贴在问题本身中。举一个相关的例子。循环可能已经足够了,内部可以简化。显然,在从F66到F77的转换期间,DEC编译器允许这样做,但有一个警告。有些编译器,例如DEC FORTRAN,有时确实使用控制变量来测试终止,在这种情况下,更改其值可能会导致错误结果DEC FORTRAN在执行此操作时发出警告。无论如何,这是一个糟糕的编程实践。我们真的需要看看这些代码。但是,您可能必须更正代码以符合标准。你的代码不是有效的Fortran,在80年代也不是有效的Fortran。但是如果它按照你说的那样做,代码就被破坏了——这在标准Fortran中是不允许的。您必须找到一个编译器,然后将其作为扩展提供—我不知道有哪一个。@VladimirF我共享代码的最佳方式是什么?此网站上的代码应始终复制粘贴在问题本身中。举一个相关的例子。循环可能已经足够了,内部可以简化。显然,在从F66到F77的转换期间,DEC编译器允许这样做,但有一个警告。有些编译器,例如DEC FORTRAN,有时确实使用控制变量来测试终止,在这种情况下,更改其值可能会导致错误结果DEC FORTRAN在执行此操作时发出警告。无论如何,这是一个糟糕的编程实践。