COMMON
ブロック内の変数の順序は重要であり、順序を変更すると悪いことが起こることが予想されます。C++ プログラムを含め、共通ブロックが使用されているすべての場所で同じである必要があります。重要でないのは、それらの変数に付けられた名前です。たとえば、1 つのサブルーチンで次のようにすることができます。
double precision a, b
common /block1/ a, b
そして別のサブルーチンでは、次のようにすることができます:
double precision c, d
common /block1/ c, d
それでもa
、c
同じメモリ位置を共有します。b
とについても同様ですd
。これは混乱を招く可能性があり、通常は、変数と共通ブロックの両方の宣言をinclude
、特定の共通ブロックを使用するすべてのサブルーチンによって -d されるファイルに入れることです。共通ブロックのいずれかで何かを変更すると、すべてのサブルーチンが変更されたことを認識し、すべてが期待どおりに機能します。
問題は、変更された共通ブロックに対応させるために、対応する C 構造体も変更する必要があることです。例えば
double precision a, b
common /block1/ a, b
C では次のように対応します。
struct common_block1
{
double a;
double b;
};
extern struct common_block1 block1_;
(注: 属性をサポートしない古い Fortran コンパイラではbind(C)
、エクスポートされた各識別子の末尾にアンダースコアが付けられるため、C/C++ ではblock1
として参照する必要がありますblock1_
)
共通ブロックを次のように変更した場合:
integer a
double precision b, c
common /block1/ a, b, c
また、C 構造体を次のように変更する必要があります。
struct common_block1
{
int a;
double b;
double c;
};
C コンパイラと Fortran コンパイラの両方で、同じメモリ アラインメント規則が使用されます。アラインメントは通常、コンパイラ オプション (C/C++/Fortran) と型属性 (C/C++) で制御できます。Fortran モジュールを使用ISO_C_BINDING
すると、Fortran と C で同じストレージ サイズの型の種類が使用されることが保証されます。最初に最大のオブジェクト (配列、(DOUBLE) COMPLEX
変数、DOUBLE PRECISION
変数など) を共通ブロックの先頭に配置し、次に小さいオブジェクトを配置することをお勧めします。オブジェクトなど。