我如何编译这个旧的 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
我正在尝试编译 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