通常、数値データの受け渡しに問題は生じません。C プログラムが Fortran ルーチンに符号なしデータ型を渡した場合、ルーチンは引数を対応する符号付きデータ型として受け取ることができます。ただし、値が符号付き型の範囲を超えないように注意する必要があります。
対応するデータ型表には、Fortran、MASM、および C/C++ の対応する数値データ型が要約されています。
C、C++、および MASM では、Fortran の COMPLEX(4) 型、COMPLEX(8) 型、および COMPLEX(16) 型を直接使用することはできません。ただし、これに対応する構造体を記述することができます。COMPLEX(4) 型は、それぞれ 4 バイトの浮動小数点数である 2 つのフィールドを持っており、第 1 フィールドは実数部、第 2 フィールドは虚数部を含みます。COMPLEX 型は COMPLEX(4) 型と同じです。COMPLEX(8) 型と COMPLEX(16) 型は、各フィールドに含まれている浮動小数点数のバイト数が異なっていることを除けば同じです (COMPLEX(8) には 8 バイトの浮動小数点数、COMPLEX(16) には 16 バイトの浮動小数点数が各フィールドに含まれています)。
IA-32 アーキテクチャー・ベースのシステムでは、COMPLEX 型の Fortran 関数は、引数リストの先頭に、隠された COMPLEX 引数を追加します。このような Fortran からの呼び出しを実装する C 関数は、この隠された引数を明示的に宣言し、値を返すために使用しなければなりません。C の戻り型は void です。
次に、Fortran COMPLEX 型用の C/C++ の構造体定義を示します。
struct complex4 { float real, imag; }; struct complex8 { double real, imag; };
次に、Fortran COMPLEX 型用の MASM の構造体定義を示します。
COMPLEX4 STRUCT 4 real REAL4 0 imag REAL4 0 COMPLEX4 ENDS COMPLEX8 STRUCT 8 real REAL8 0 imag REAL8 0 COMPLEX8 ENDS
Fortran LOGICAL(2) は、2 バイトの標識の値として格納されます (0 は FALSE。TRUE の値の処理方法は、-fpscomp [no]logicals コンパイラー・オプション (Linux* および Mac OS* X) または /fpscomp:[no]logicals コンパイラー・オプション (Windows*) によって決定されます)。Fortran LOGICAL(4) の値は、4 バイトの標識の値として格納され、LOGICAL(1) は 1 バイトとして格納されます。LOGICAL 型は LOGICAL(4) と同じで、C の int 型に相当します。
Fortran では引数リスト、モジュール、共通ブロック、またはグローバル変数で LOGICAL 型の変数を使用できます。C では同じ引数に int 型を使用することができます。共通ブロックで使用する場合は、LOGICAL(4) 型を推奨します。
C++ のクラス型は、クラスが仮想関数を定義しているか、基本クラスを持っている場合を除き、対応する C の struct 型と同じ構成を持ちます。これらの機能を持たないクラスは、C の構造体と同じ方法で渡すことができます。
Fortran プログラムで、関数から COMPLEX 型または DOUBLE COMPLEX 型の値が返されると予測される場合、Fortran コンパイラーは呼び出されたプロシージャーの引数リストの先頭に 1 つの引数を追加します。この引数は、呼び出されたプロシージャーが結果を格納する位置を示すポインターです。
次に、WBAT という名前の複素数データ型プロシージャーを返すための Fortran コードとそれに対応する C ルーチンの例を示します。
C から Fortran への複素数データ型の戻り例
Fortran のコード
COMPLEX BAT, WBAT REAL X, Y BAT = WBAT ( X, Y )
対応する C ルーチン
Linux の例:
struct _mycomplex { float real; float imag; }; typedef struct _mycomplex _single_complex; void wbat_ (_single_complex *location, float *x, float *y){ *location->real = *x; *location->imag = *y; return; }
Windows の例:
struct _mycomplex { float real, imag }; typedef struct _mycomplex _single_complex; void WBAT (_single_complex location, float *x, float *y) { float realpart; float imaginarypart; ... program text, producing realpart and imaginarypart... *location.real = realpart; *location.imag = imaginarypart; }
上記の例では、次の制限および動作が適用されます。
引数 location は、Fortran の呼び出し文で指定するわけではありません。コンパイラーによって追加されます。
C サブルーチンは、結果の実数部と虚数部を location に正しくコピーしなければなりません。
呼び出されたプロシージャーは void 型です。
関数から DOUBLE COMPLEX 値が返された場合、WBAT の location の定義で、float 型が double 型に置き換えられます。