loops - Fortran 2018+ 中过时的 DO 循环

标签 loops fortran gfortran

我正在使用可能在最新版本的 gfortran 之前编写的源代码。我知道 DO、END DO 和 CONTINUE 的方式已经改变,因此无法共享循环终止。有一个方便的链接here .问题是,我不知道解释真正告诉我在那个页面上做什么。如果我在一个新脚本中设置了一个非常基本的 DO 循环,它编译时不会出错。我不确定如何对其进行逆向工程以找出问题所在。
这是返回错误消息的代码的一部分。

              DO 20 II = I1, I2
              IW = ICN(II)
!             Has node iw been on stack already?
              IF (NUMB(IW)==0) GOTO 70
!             Update value of LOWL(IV) if necessary.
20          LOWL(IV) = MIN(LOWL(IV),LOWL(IW))

!           There are no more edges leaving node IV.
            ARP(IV) = -1
!           Is node IV the root of a block.
30          IF (LOWL(IV)<NUMB(IV)) GOTO 60

!           Order nodes in a block.
            NUM = NUM + 1
            IST1 = N + 1 - IST
            LCNT = ICNT + 1
!           Peel block off the top of the stack starting at the
!           top and working down to the root of the block.
            DO STP = IST1, N
              IW = IB(STP)
              LOWL(IW) = N + 1
              ICNT = ICNT + 1
              NUMB(IW) = ICNT
              IF (IW==IV) GOTO 50
            END DO
错误看起来像这样。对于出现的任何过时的 DO 循环,基本上都会重复相同的错误,并且是编译时出现的唯一类型的错误。
dvode_f90_m.f90:15865:45:

15865 | 20          LOWL(IV) = MIN(LOWL(IV),LOWL(IW))
      |                                             1
Warning: Fortran 2018 deleted feature: DO termination statement which is not END DO or CONTINUE with label 20 at (1)
我想知道如何重做此代码块中的 DO 循环,以便我可以浏览并更新此源代码。如果相关,我在 Cygwin 上运行 GFortran9.3.0。

最佳答案

正如警告消息所说,所有 DO循环应该以 END DO 结束或 CONTINUE , 例如:

            DO 20 IV = 1, 100
            LOWL(IV) = MIN(LOWL(IV),LOWL(IW))
20          CONTINUE
旧版本的 Fortran 允许程序员删除终止行,从而缩短
            DO 20 IV = 1, 100
20          LOWL(IV) = MIN(LOWL(IV),LOWL(IW))
但是,这两个代码在功能上是等效的。您可以使用一些简单的循环自行测试它。

关于loops - Fortran 2018+ 中过时的 DO 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63730527/

相关文章:

matlab - 如何在 MATLAB 的循环中创建/处理变量?

arrays - 最近的 Fortran 标准中提供了此功能吗?

arrays - 在 gfortran 中分配大矩阵时整数溢出

java - do while 循环在我不希望它循环时循环

javascript - 定时器循环永远不会运行

javascript - 在哪里调用 for 循环来迭代值数组

fortran - gfortran 找不到那里的库

performance - Fortran 分配/解除分配

java - 如何将 Fortran 代码与 Java GUI 集成?

fortran - 在模块中使用外部函数