gfortran не распознает комментарии в файле.h, начинающиеся с 'c' в первом столбце
Я пытаюсь включить файл "ах" в фортрановскую программу "bf". Содержимое этих файлов следующее:
ах
c This is a comment
k = 10
100 format( I5 )
Б.Ф.
program test_include
include 'a.h'
write(*,100) k
end program test_include
Когда я пытаюсь скомпилировать файл "BF", используя следующую команду
gfortran -ffree-form b.f
Компилятор выдает ошибку
Included at b.f:2:
c This is a comment
1
Error: Unclassifiable statement at (1)
Но когда я изменяю строку комментария на
!c This is a comment
gfortran успешно его компилирует и программа работает правильно.
Может кто-нибудь сказать мне, как заставить gfortran распознавать строки, начинающиеся с 'c' в файле '*.h', в качестве комментария. Я пытаюсь включить подобный файл (с комментариями, начинающимися с 'c') из библиотеки в мой код Fortran в свободной форме, и я не могу сделать все комментарии, начинающиеся с 'c' в этом файле, чтобы начать с '!'.
1 ответ
Включаемый файл находится в фиксированной форме! Вы не можете смешивать свободную и фиксированную форму в одном файле. поскольку
[] эффект строки INCLUDE заключается в том, что исходный текст, на который ссылаются, физически заменяет строку INCLUDE до обработки программы [,]
объединенный исходный текст должен иметь либо фиксированную, либо свободную форму, но не смесь обоих. [Источник: Фортран 2008 Стандарт, кл. 3,4 (6)]
Это оставляет вам два варианта:
- Преобразовать основную программу в фиксированную форму или
- Преобразуйте включаемые файлы в свободную форму.
Для 1) нужно указать -ffixed-form
и форматировать b.f
соответствовать установленной форме. b.f
будет выглядеть
program test_include
include 'a.h'
write(*,100) k
end program test_include
Для 2), вы должны конвертировать включаемые файлы в свободную форму. Включение может быть записано как:
! This is a comment
k = 10
100 format( I5 )
Если вы не можете конвертировать все файлы, я бы предложил написать модули-оболочки в фиксированной форме, include
исходный код и с тех пор use
модули обертки вместо. В случае предоставленного вами фрагмента, это потребует дальнейших размышлений, но в случае включаемых файлов только с переменными / параметрами / интерфейсами это может выглядеть
module wrapper_vars
include 'vars.h'
end module
Для подпрограмм и функций вы также можете использовать модули:
module wrapper_subroutines
contains
include 'subroutines.h'
end module