Использование Do-Loops во включаемых файлах

В моем коде на языке fortran я пытаюсь включить цикл DO, но в итоге получаю "цикл DO или BLOCK IF не закрыт". Появляется, если любые другие циклы DO после открытия оператора INCLUDE обрабатывают их как вложенные циклы, указывая, что включенная открывающая строка DO интерпретируется правильно, но не оператор END DO. Я сократил включенный код до минимума, чтобы убедиться, что это цикл, а не операторы в цикле, вызывающие проблему. Управляющая переменная объявляется перед циклом DO.

DO A = 1,3
END DO

Разве Fortran77 не допускает петли DO в файлах INCLUDE?

Я использую gfortran для моего компилятора, если он сильно меняется.

Изменить: грамматика

Edit2: я использую GCC 4.6.2. Теперь отметим, что если это что-то меняет, gfortran запускается из make-файла, созданного PSCAD. Я могу предоставить информацию об этом, если это уместно.

Вот код, который испытывает эту проблему:

TEST.F:

SUBROUTINE TESTFX() 
INTEGER A 
INCLUDE '../HDR.INC' 
END

HDR.INC:

DO A = 1,3 
END DO

Edit3: отредактировал опечатки в коде и удалил RETURN из подпрограммы.

2 ответа

Фортран 77 вообще НЕ ВКЛЮЧАЕТ. Это впервые появилось в стандарте Fortran в Fortran 90. Тем не менее, INCLUDE был доступен как расширение практически во всех компиляторах Fortran 77, и его поведение было таким же - по сути, это то же самое, что вставка включенного файла в исходный файл. где ВКЛЮЧЕНО появляется. Нет никаких ограничений на то, что может быть там, хотя я видел, как компиляторы боролись с проблемами, связанными с блочными конструкциями, которые перекрывают границу включаемого файла.

Возможно, если вы включите как исходный файл, так и текст включаемого файла и точно сообщите нам, какую версию gfortran вы используете, можно получить более точный ответ.

Ваш INCLUDE должен быть помещен в новую строку, он не является частью заявления, в котором говорится A. Почему у вас есть апострофы в ваших концах? Они не могут быть там. Утверждение RETURN перед END также совершенно лишнее. Пытаться:

TEST.F:

SUBROUTINE TESTFX() 

INTEGER A

INCLUDE '../HDR.INC' 

END SUBROUTINE

HDR.INC:

DO A = 1,3 
END DO
Другие вопросы по тегам