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. Преобразовать основную программу в фиксированную форму или
  2. Преобразуйте включаемые файлы в свободную форму.

Для 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
Другие вопросы по тегам