【问题标题】:How can I compile this older Fortran code?如何编译这个较旧的 Fortran 代码?
【发布时间】: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


【解决方案1】:

你正在改变循环的迭代变量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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多