【发布时间】:2020-11-15 04:15:58
【问题描述】:
我正在尝试在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
【问题讨论】:
-
我们真的需要看看那个代码。但是,您可能必须更正代码以符合标准。您的代码不是有效的 Fortran,它在 80 年代也不是有效的 Fortran。
-
但是如果它按照你所说的那样做代码被破坏了——这在标准的 Fortran 中是不允许的。您将不得不找到一个编译器,而不是将其作为扩展提供 - 我不知道有一个。
-
@VladimirF 我分享代码的最佳方式是什么?
-
本网站上的代码应始终复制粘贴到问题本身中。举一个相关的例子。循环大概就够了,里面可以简化。
-
显然 DEC 编译器在从 F66 转换到 F77 时允许这样做并发出警告。来自ibiblio.org/pub/languages/fortran/ch2-18.html" 有编译器(例如 DEC FORTRAN),有时确实使用控制变量来测试终止,在这种情况下,更改其值可能会导致错误结果(DEC FORTRAN 在这样做时会发出警告) . 无论如何,这是一种糟糕的编程习惯。”
标签: compiler-errors fortran gfortran