Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops Fortran 2018中过时的DO循环+;_Loops_Fortran_Gfortran - Fatal编程技术网

Loops Fortran 2018中过时的DO循环+;

Loops Fortran 2018中过时的DO循环+;,loops,fortran,gfortran,Loops,Fortran,Gfortran,我正在使用的源代码可能是在gfortran的最新版本之前编写的。我知道DO、END DO和CONTINUE的方式已经改变,因此无法进行共享循环终止。有一个方便的链接。问题是,我不知道那页上的解释到底告诉我要做什么。如果我在一个新脚本中设置了一个真正基本的DO循环,那么它编译时不会出错。我不知道如何对其进行反向工程以找出问题所在 下面是返回错误消息的代码的一部分 DO 20 II = I1, I2 IW = ICN(II) !

我正在使用的源代码可能是在gfortran的最新版本之前编写的。我知道DO、END DO和CONTINUE的方式已经改变,因此无法进行共享循环终止。有一个方便的链接。问题是,我不知道那页上的解释到底告诉我要做什么。如果我在一个新脚本中设置了一个真正基本的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循环,以便我能够浏览并更新这个源代码。如果相关,我正在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))

然而,这两种代码在功能上是等效的。您可以自己用一些简单的循环来测试它。

在Fortran 2018之前,DO构造有两种形式:块DO构造和非块DO构造。Fortran 2018删除了非块DO构造,编译器发出的警告与使用此删除表单有关。共享终止是一个稍微不同的问题

Fortran 2018中的DO构造(先前语言标准中的块DO构造)要求终止语句是
end DO
语句或(带标签的)
continue
语句。(如果do构造是带标签的do构造,如
do 1…
,则必须标记
end do
语句)

非块DO构造的限制性要小得多,允许许多其他语句(操作语句)作为DO构造的标记端。但是,带标签的终止语句始终在DO构造的范围内(因此将在每次迭代中执行)。赋值语句(如问题中的)是动作语句

这意味着您可以对问题的(Fortran 2008非块)DO构造进行现代化(删除注释并更改为自由格式源代码以清晰显示)

使用未标记的形式

DO II = I1, I2
   IW = ICN(II)
   IF (NUMB(IW)==0) GOTO 70
   LOWL(IV) = MIN(LOWL(IV),LOWL(IW))
END DO
DO 20 II = I1, I2
   IW = ICN(II)
   IF (NUMB(IW)==0) GOTO 70
   LOWL(IV) = MIN(LOWL(IV),LOWL(IW))
20 END DO ! OR CONTINUE
或标签形式

DO II = I1, I2
   IW = ICN(II)
   IF (NUMB(IW)==0) GOTO 70
   LOWL(IV) = MIN(LOWL(IV),LOWL(IW))
END DO
DO 20 II = I1, I2
   IW = ICN(II)
   IF (NUMB(IW)==0) GOTO 70
   LOWL(IV) = MIN(LOWL(IV),LOWL(IW))
20 END DO ! OR CONTINUE

我相信很多人都会喜欢没有标签的表格。事实上,标签表单在Fortran 2018中已经过时。

如果仔细阅读gfortran的消息,您会注意到收到警告。您没有收到错误。解决此问题的一种方法是从do循环和带标签的语句中删除20,并在带标签的语句后添加
end do
。非常感谢您的直截了当的解释,只需稍加更正。没有错误消息。有一个警告。这些是完全不同的事情。@evets你是对的。我更正了答案的措辞。