2013-08-05 3 views
1

В моем коде fortran я пытаюсь включить цикл DO, но я заканчиваю «DO-цикл или BLOCK IF not closed». Он появляется, если какие-либо другие DO-петли после инструкции INCLUDE открыты, они рассматривают их как вложенные циклы, указывая на то, что включенная начальная строка DO интерпретируется правильно, но не оператор END DO. Я сократил включенный код до bare-bones, чтобы убедиться, что это цикл, а не инструкции в цикле, дающие проблемы. Контрольная переменная объявляется до цикла DO.Использование Do-Loops в include-файлах

DO A = 1,3 
END DO 

Не допускает ли Fortran77 кодов DO в INCLUDE-файлах?

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

Edit: грамматика

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: Отредактированные опечатки в коде и удален ВОЗВРАТ из подпрограммы.

+0

Я думаю, эти паразитные кавычки после окончания и в конце этого являются непреднамеренным. и включение на самом деле в свою очередь? Я бы сделал чистое редактирование, но, может быть, тэты - ваша проблема. – agentp

+0

Каков полный и точный текст сообщения об ошибке, которое вы получаете? Как и Джордж, я полагаю, что форматирование и кавычки не находятся в исходном исходном коде. –

+0

«Ошибка в строке 6 TEST.f: цикл DO или BLOCK IF не закрыт» - это ошибка. Кроме того, я сделал предположение, что PSCAD использовал gfortran, что было неправильно. PSCAD фактически компилируется с использованием f2c, и я не уверен, что f2c использует g77, который находится в том же каталоге, что и f2c, вызываемый make-файлом. Это заканчивается компилятором: «f2c.exe -r8 -w -Nn5000 -NL400 -Nx400 -I» C: \ PROGRA ~ 1 \ PSCAD42 \ emtdc \ gnu \ inc "-I" C: \ PROGRA ~ 1 \ PSCAD42 \ emtdc \ gnu \ windows "-g TEST.f" из файла makefile. –

ответ

1

У Fortran 77 нет INCLUDE вообще. Это впервые появилось в стандарте Fortran в Fortran 90. Тем не менее, INCLUDE был доступен как расширение почти во всех компиляторах Fortran 77, и поведение было одинаковым - это по сути то же самое, что и вставка включенного файла в исходный файл где появляется INCLUDE. Нет ограничений на то, что может быть там, хотя я видел, как компиляторы борются с проблемами, связанными с блочными конструкциями, которые охватывают границу файла include.

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

+0

Я использую GCC 4.6.2. Теперь, если это имеет значение, gfortran запускается из make-файла, созданного PSCAD. Я могу предоставить информацию об этом, если это уместно. Вот код, который переживает этот вопрос: TEST.F: 'SUBROUTINE TESTFX() INTEGER A включают' ../HDR.INC ' RETURN END ' HDR.INC: 'DO A = 1,3 END DO ' –

+0

Извините, попытался добавить код в комментарий. Я обновил свой вопрос с помощью некоторого примера кода. –

0

Ваш ВКЛЮЧЕН должен быть размещен на новой строке, он не является частью заявления, объявляющего А. Почему у вас есть апострофы в ваших END? Их не может быть. Заявление RETURN перед END также является излишним. Попробуйте:

TEST.F:

SUBROUTINE TESTFX() 

INTEGER A 

INCLUDE '../HDR.INC' 

END SUBROUTINE 

HDR.INC:

DO A = 1,3 
END DO 
+0

Простите за апострофы и новую строку. Фиксированная почта. Был продуктом копий-пасты. Код, который вы предоставили, точно так же, как и у меня, это сохранение для оператора return и завершения подпрограммы. Я попытался запустить удаление оператора return и изменить «END» на «END SUBROUTINE», но все еще имеет ту же проблему, и компилятор сообщает синтаксическую ошибку с помощью строки «END SUBROUTINE». –

Смежные вопросы