通常、数値データの受け渡しに問題は生じません。C プログラムが Fortran ルーチンに符号なしデータ型を渡した場合、ルーチンは引数を等価な符号付きデータ型として受け取ることができます。ただし、値が符号付き型の範囲を超えないように注意する必要があります。
「等価なデータ型」表には、Fortran と C/C++ の等価な数値データ型が要約されています。
C および C++ は、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 LOGICAL(2) は、2 バイトの標識の値として格納されます (0 は FALSE。TRUE の値の処理方法は -fpscomp [no]logicals コンパイラ・オプションによって決定されます)。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 ルーチン:
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;
}
上記の例では、次の制限および動作が適用されます:
引数の位置は、Fortran の呼び出し文で指定するわけではありません。 コンパイラによって追加されます。
C サブルーチンは、結果の実数部と虚数部を location に正しくコピーしなければなりません。
呼び出されたプロシージャは void 型です。
関数から DOUBLE COMPLEX 値が返された場合、WBAT の location の定義で、float 型が double 型に置き換えられます。