Fortran 中合并 DO 和 IF 的错误

An error combining DO and IF in Fortran

这是我用 Visual FORTRAN 6.6A 编写的部分代码:

  .
  .
  .
   DO 24 I=1,80
24 IF ((NODNUM(1) .EQ. I) .AND. (CAUCHY(3,2) .LT. CTI(I+12))) THEN
      ARRAY(1)=C1*0.99
      END IF
  .
  .
  .

而且我编译的时候出现了这个错误:

*--------------------Configuration: ovl30u_moon1 - Win32 Debug--------------------
Compiling Fortran...
C:\Documents and Settings\XPMUser\Desktop\ovl30u_moon1.f

C:\Documents and Settings\XPMUser\Desktop\ovl30u_moon1.f(567) : Error: This is not a valid termination statement for a DO construct.

24 IF ((NODNUM(1) .EQ. I) .AND. (CAUCHY(3,2) .LT. CTI(I+12))) THEN
---^

C:\Documents and Settings\XPMUser\Desktop\ovl30u_moon1.f(569) : Error: An ENDIF occurred without a corresponding IF THEN or ELSE statement.
END IF
-----------^

Error executing df.exe.
ovl30u_moon1.obj - 2 error(s), 0 warning(s)*

我也试过了,但仍然存在错误:

   DO 24 I=1,80
24 IF ((NODNUM(1) .EQ. I) .AND. (CAUCHY(3,2) .LT. CTI(I+12))) THEN
      ARRAY(1)=C1*0.99
      END IF
   END DO

感谢任何建议。

使用标签终止 do 循环在您指定的方式中无效。对于 FORTRAN 77 使用:

   DO 24 I=1,80
      IF ((NODNUM(1) .EQ. I) .AND. (CAUCHY(3,2) .LT. CTI(I+12))) THEN
          ARRAY(1)=C1*0.99
      END IF
24 CONTINUE

在 Fortran 90+ 中,您可以简单地省略标签:

   DO I=1,80
      IF ((NODNUM(1) .EQ. I) .AND. (CAUCHY(3,2) .LT. CTI(I+12))) THEN
          ARRAY(1)=C1*0.99
      END IF
   END DO

或者,如果您依赖于标签,则可以使用

   label: DO I=1,80
      IF ((NODNUM(1) .EQ. I) .AND. (CAUCHY(3,2) .LT. CTI(I+12))) THEN
          ARRAY(1)=C1*0.99
      END IF
   END DO label

要添加到 ,还有另一种方法可以重述您的具体情况。

虽然不允许使用 if 构造作为非块(标记)的终止 do 但可以使用 if 语句:

   DO 24 I=1,80
24 IF ((NODNUM(1) .EQ. I) .AND. (CAUCHY(3,2) .LT. CTI(I+12))) ARRAY(1)=C1*0.99

你可以,但你真的不应该:使用另一个答案中的块结构。

有关详细信息,请参阅 Fortran 2008 8.1.6.3 和 R214。