2015-02-18 2 views
1

Это часть кода, который я пишу в Visual Fortran 6.6a:ошибка объединения DO и IF в Fortran

. 
    . 
    . 
    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 

Любые советы, оцененные.

+0

Я попытался улучшить форматирование вывода компилятора, но мне пришлось немного догадаться. Если это не совсем правильно, мои извинения, но, пожалуйста, исправьте. – francescalus

ответ

2

Завершение цикла 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 
+0

Спасибо за ответ BRO – user3806398

0

Чтобы добавить к Alexander Vogt's answer, есть другой способ повторить ваш конкретный случай.

Хотя не разрешаются использовать 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 

Вы можете, но вы действительно не должны» t: используйте конструкцию блока, как в другом anwer.

Подробнее см. Fortran 2008 8.1.6.3 и R214.

+2

Просто для информации - текущий проект [F201X] (http://j3-fortran.org/doc/year/15/15-007.pdf) удаляет это как вариант, поэтому, возможно, это должно быть «Вы можете, но вы действительно, действительно, действительно не шутите ...» – IanH

+0

Сначала я подумал, что вы имеете в виду утверждение if как завершение действия, но, похоже, вы имеете в виду, что вся конструкция неблокированного do удаляется (в черновике) , – francescalus