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

How can I compile this older Fortran code?

我正在尝试编译 80 年代后期在 DEC 操作系统上编写和编译的 Fortran 代码。我不确定代码是用哪个版本的 Fortran 编写的。

我正在使用 macOS 版本 10.14.6,并使用 gfortran 版本 8.2.0

当我尝试在命令行上编译时:

gfortran -v -fdec- o test CODE.FOR

我收到以下错误:

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

      DO 10 J=1,NMAX
      WRITE(6,*)' Give STA NAME, COMP(Z, R, or T), and WAVE TYPE (P, SV,
     * or SH)'
      WRITE(6,*)' Enter blanks to quit'
      WRITE(6,*)' Reenter STA NAME, COMP and WAVE TYPE to replace old or
     *incorrect data'
      WRITE(6,*)' Separate each entry by a space (STA NAME is 4 chars)'
      READ(5,2) SN(J),COMP(J),PS(J)
2     FORMAT(A,1X,A,1X,A)
      IF (SN(J).EQ.'    ') GO TO 900
      WRITE(6,*)' Give DIST, AZ, and AMP'
      READ(5,*) R(J),AZ(J),AMP(J)
      IF (J.GT.1) THEN
        DO 11 I=1,J-1
        IF (SN(J).EQ.SN(I).AND.COMP(J).EQ.COMP(I).AND.PS(J).EQ.PS(I))
     *   THEN
            R(I)=R(J)
            AZ(I)=AZ(J)
            AMP(I)=AMP(J)
            J=J-1
            GO TO 10
        END IF
11      CONTINUE
      END IF
10    CONTINUE

你正在改变循环的迭代变量J

DO 10 J=1,NMAX

J=J-1

这是不允许的。

您可以轻松地将任何索引 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 = 1
     DO WHILE (J<=NMAX)

         if (..) J = J - 1

         J = J + 1

     END DO