компилятором gfortran не признает замечаний.H файл, который начинается с "c" в первом столбце


Я пытаюсь включить файл 'a. h' в программу Fortran 'b. f' Содержимое файлов выглядит следующим образом:

A. h

c     This is a comment
      k = 10
 100  format( I5 )

B. f

program test_include
    include 'a.h'
    write(*,100) k
end program test_include

Когда я пытаюсь скомпилировать файл 'b. f', используя следующую команду

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 распознавать линии начиная с буквы " С "в букве "а"*.H ' файл в качестве комментария. Я пытаюсь включить подобный файл (с комментариями, начинающимися с "c") из библиотеки в мой свободный код fortran, и я действительно не могу сделать все комментарии, начинающиеся с " c "в этом файле, чтобы начать с"!".

1 2

1 ответ:

Включаемый файл находится в фиксированной форме! Вы не можете смешивать свободную и фиксированную форму в одном файле. Так как

[эффект] строки INCLUDE выглядит так, как если бы исходный текст ссылки физически заменил строку INCLUDE priorto program processing [,]

Объединенный исходный текст должен быть либо фиксированной, либо свободной формой, но не смесью того и другого. [Источник: Fortran 2008 Standard, Cl. 3.4 (6)]

Это оставляет вам два варианта:

  1. преобразование главного программа в фиксированной форме, или
  2. конвертируйте файлы include в свободную форму.

Для 1), вам нужно указать -ffixed-form, и формат b.f, чтобы соответствовать фиксированной форме. b.f тогда будет выглядеть как

      program test_include
          include 'a.h'
          write(*,100) k
      end program test_include

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

!     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