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。
这是我用 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.fC:\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。