Заголовок PETSC#include'd в модуле

У меня есть модуль, который содержит глобальные переменные. Чтобы объявить некоторые глобальные переменные, мне нужно использовать HDF5. Я также использую библиотеку, поэтому мне также нужно включить заголовочный файл. Таким образом, преамбула global_variable.F90 выглядит следующим образом.

module global_variables

use HDF5
#include "finclude/petscsys.h"
#include "finclude/petscvec.h"

integer(HID_T) id_file
integer(HID_T) id_plist
Vec M, C, K
...

end module

Vec - это тип данных, определенный в заголовочном файле, а HID_T - это тип данных, определенный в модуле HDF5.

Теперь у меня есть файл, который содержит подпрограммы для ввода-вывода. Этот файл также использует HDF5 и ту же библиотеку, что и в global_variables.F90. Итак, IO.F90 выглядит так.

module io

use global_varibles

contains

subroutine read_input_file( vector )

Vec vector
integer HDF5err

call H5open_f( HDF5err )
...

end subroutine

end module

Вопрос 1: компилятор возвращает ошибку при компиляции IO.F90, говоря, что Vec имеет неопределенный тип данных. Но он не жалуется на HID_T. Я думал, что модуль global_variables уже содержит как модули HDF5, так и заголовочные файлы, используя модуль global_variables в IO.F90 будет обрабатывать все объявления типов данных, но, похоже, нет. Не могли бы вы помочь мне понять, что я неправильно понимаю?

Вопрос 2: Есть ли способ ограничить действие #include для модуля, где он объявлен?

PS. Если я включу #include "finclude/petscvec.h" в IO.F90, который объявляет Vec, он хорошо компилируется.

1 ответ

Решение

Синтаксис

Vec vector

совершенно чужд Фортрану. Он работает только потому, что Vec - это макрос препроцессора C (CPP), определенный в заголовочном файле "finclude / petscvec.h" как

#define Vec PetscFortranAddr

Это означает, что вы должны включить заголовочный файл в каждый файл Fortran, в котором вы используете вышеуказанный синтаксис с Vec, Макрос не может быть унаследован с использованием Fortran use потому что это не часть Фортрана.

PetscFortranAddr в конце определяется в "finclude / petscdef.h" как целое число с 4 или 8 байтами в зависимости от вашей системы.

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

Другие вопросы по тегам