数値,複素数,および論理データ型の処理

通常,数値データの渡しには問題は生じないはずです。C プログラムが Fortran ルーチンに符号なしデータ型を渡した場合,ルーチンは引数を等価な符号付きデータ型として受け取ることができます。ただし,値が符号付き型の範囲を超えないように注意する必要があります。

等価なデータ型表は,Fortran,MASM,および Visual C/C++ での等価な数値データ型を要約しています。

C,Visual C++,および MASM は,Fortran の COMPLEX(4) および COMPLEX(8) 型を直接には実装していません。ただし,これと等価な構造体を書くことができます。COMPLEX(4) 型は,それぞれ 4 バイトの浮動小数点数である 2 つの欄を持っており,第 1 欄は実部,第 2 欄は虚部を含んでいます。COMPLEX 型は COMPLEX(4) 型と等価です。COMPLEX(8) 型は,各欄が 8 バイトの浮動小数点数を含んでいることを除けば同じです。


注意:ia32 システムでは,COMPLEX 型の Fortran 関数は,引数並びの先頭に隠された COMPLEX 引数を追加します。このような Fortran からの呼び出しを実装する C 関数は,この隠された引数を明示的に宣言し,これが値を返すために使用しなくてはなりません。C の戻り型は void でなくてはなりません。

次に,Fortran COMPLEX 型用の Visual 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 は偽。真の値の扱いは /fpscomp:[no]logicals コンパイラ・オプションによって決定されます)。Fortran LOGICAL(4) の値は,4 バイトの指示子の値として格納され,LOGICAL(1) は 1 バイトとして格納されます。LOGICAL 型は LOGICAL(4) と同じで,C の int 型と等価です。

Fortran の引数並び,モジュール,共通ブロック,または大域変数中では,LOGICAL 型の変数を C の int 型と同じ引数として使用することができます。共通ブロックで使用するときには,LOGICAL(4) 型の方が,それよりも短い版よりも優れています。

Visual C++ のクラス型は,クラスが仮想関数を定義しているか,基本クラスを持っている場合を除き,対応する C の struct 型と同じ構成を持っています。これらの機能を持たないクラスは,C の構造体と同じ方法で渡すことができます。