インテル® Fortran コンパイラー 19.0 デベロッパー・ガイドおよびリファレンス
Fortran の共通ブロックおよび C の構造体の間で参照を行う場合、メンバー変数をメモリーに格納する方法が共通ブロックと構造体で異なる点に注意する必要があります。Fortran は次の規則に従って、共通ブロックの変数を最大限にパックしてメモリーに格納します。
共通ブロック内にある単一の BYTE、INTEGER(1)、LOGICAL(1)、または CHARACTER 変数は、メモリー内にある前の変数または配列の直後から始まります。
その他すべての型の単一変数は、メモリー内にある前の変数または配列の直後の偶数アドレスから始まります。
すべての変数配列は、メモリー内にある前の変数または配列の直後の偶数アドレスから始まりますが、CHARACTER 配列は例外で、常に前の変数または配列の直後から始まります。
すべての共通ブロックは、4 バイトでアライメントされたアドレスから始まります。
これらの規則があるため、C の構造体要素と Fortran の共通ブロック要素のアライメントを考慮しなければなりません。特に、両方の言語ですべての変数を同じ型または種類にするか (両方の言語で 4 バイトおよび 8 バイトのデータ型のみ使用することで、簡単にこの作業を行うことができます)、または C のコードで C の構造体の前後に C のパックプラグマを使用することで、要素の一致を保証する必要があります。そうすることで、C のデータパッキングと Fortran のデータパッキングの互換性を保持できます。
例えば、Fortran コードに Really という名前の共通ブロックが含まれているとします。
Fortran コード例 |
---|
|
このデータ構造に C のコードからアクセスするには、次の外部データ構造を使用します。
C コード例 |
---|
#pragma pack(2) extern struct { float x, y, z[6]; double ydbl; } Really; #pragma pack() |
元のパック状態に戻すには、構造体の終わりに #pragma pack() を追加する必要があります。
また、C の構造体に対応する共通ブロックを作成することで、Fortran から C の構造体にアクセスすることもできます。これは上記の説明とは逆のケースです。ただし、実装の方法は同じです。共通ブロックと構造体が定義され、共通のアドレス (名前) が割り当てられ、メモリー内のアライメントが行われている場合、どちらの言語も変数の同じメモリー位置を共有します。
アライメントおよびパディングを考慮しておけば、C 言語から共通ブロック全体、または複数の共通ブロックにアクセスすることができます。また、Fortran 共通ブロックの個々のメンバーは、その他のデータ項目と同じように引数リストで渡すことができます。