1

グローバル変数を保持するモジュールがあります。いくつかのグローバル変数を宣言するには、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 モジュールで定義されているデータ型です。

これで、I/O 用のサブルーチンを保持するファイルができました。このファイルも 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 モジュールとヘッダー ファイルの両方が含まれていると思いました。IO.F90 で global_variables モジュールを使用すると、すべてのデータ型宣言が処理されますが、そうではないようです。私が間違っていることを理解するのを手伝ってもらえますか?

質問 2: #include の効果を、それが宣言されているモジュールに制限する方法はありますか?

PS。Vec#include "finclude/petscvec.h"を宣言する IO.F90にインクルードすると、うまくコンパイルされます。

4

1 に答える 1

3

構文

Vec vector

Fortran とは完全に異質です。これは、Vec がヘッダー ファイル「finclude/petscvec.h」で次のように定義されている C プリプロセッサ (CPP) マクロであるためにのみ機能します。

#define Vec PetscFortranAddr

つまり、上記の構文を使用するすべての Fortran ファイルにヘッダー ファイルを含める必要がありますVec。マクロはuseFortran の一部ではないため、Fortran を使用して継承することはできません。

PetscFortranAddr最後に、「finclude/petscdef.h」で、システムに応じて 4 または 8 バイトの整数として定義されます

プリプロセッサが最終的にどうなるかをリバースエンジニアリングする以外に、おそらくあなたにできることは何もありませんが、私はそのようには行きません.それは移植性がないかもしれません.

于 2016-02-20T11:26:01.060 に答える