言語が混在したプログラミングにおける引数の渡し方

Fortran と C,Visual C++,Visual Basic,および MASM の間でデータを渡すには,個々の言語で行う場合と同じように,呼び出し引数並びを使用することができます (たとえば,CALL MYSUB(a,b,c) 中の引数並び abc)。個々の引数を渡す方法は 2 つあります。

すべての呼び出しについて,呼び出し側のプログラムと呼び出される側のルーチンで,個々の引数の渡し方が一致していることを確認する必要があります。さもないと,呼び出されたルーチンは無効なデータを受け取ることになります。

Fortran 引数の渡し方は,指定された呼び出し規約によって変わります。基本設定では,Fortran はすべてのデータを参照で渡します。例外として,文字列の隠された文字長引数は,値で渡されます。

ATTRIBUTES C または STDCALL オプションが使用されると,基本設定は,配列以外はすべて値で渡すように変わります。手続に対して C または STDCALL オプションに加えて REFERENCE オプションが指定されている場合,すべての引数が基本設定では参照で渡されます。

Fortran では,呼び出し規約オプションの CSTDCALL による引数渡しの設定に加えて,引数オプション VALUEREFERENCE を指定して,引数を値または参照で渡すことができます。言語が混在したプログラミングでは,基本設定に頼るよりも,渡し方を明示的に指定する方がいいでしょう。


注意ATTRIBUTES に加えて,コンパイラ・オプションの /iface も,いくつかの基本引数渡し規約を設定します (文字列の隠された文字長など)。

次に,C,Visual Basic,および MASM での参照と値渡しの例を示します。いずれも,次に示すサンプル Fortran サブルーチン TESTPROC へのインタフェースです。TESTPROC の定義は,個々の引数がどのように渡されるかを宣言しています。REFERENCE オプションは,この例では厳密には必要ではありませんが,これを使うことで引数の渡し規約が明確になります。

	SUBROUTINE TESTPROC( VALPARM, REFPARM )
	   !DEC$ ATTRIBUTES VALUE :: VALPARM
	   !DEC$ ATTRIBUTES REFERENCE :: REFPARM
	   INTEGER VALPARM
	   INTEGER REFPARM
	END

次表に,引数を参照と値で渡す方法を要約します。C の配列名は,配列は通常参照で渡されるので,その開始アドレスと等価なものとして設定されます。REFERENCE プロパティは,個々の引数だけでなく手続にも割り当てることができます。

引数の参照と値渡し

言語 属性 引数の型 参照渡し 値渡し
Fortran 基本設定 スカラと構造型 基本設定 VALUE オプション
C または STDCALL オプション スカラと構造型 REFERENCE オプション 基本設定
基本設定 配列 基本設定 値渡しは不可
C または STDCALL オプション 配列 基本設定 値渡しは不可
Visual C/C++ 配列以外 argument_name のポインタ 基本設定
配列 基本設定 Struct {type} array_name
Visual Basic すべての型 基本設定 ByVal
MASM すべての型 PTR 基本設定

この表では,Visual Fortran における文字引数と Fortran 95/90 ポインタ引数の渡し方については触れていません。これらの引数は,他の引数とは異なる形で渡されるからです。基本設定では,Fortran は文字列長を値で渡し,文字列を参照で渡します。文字列長の位置は,コンパイラ・オプション /iface:mixed_str_len_arg (文字列の先頭アドレスの直後) と /iface:nomixed_str_len_arg (全引数の後) のどちらが指定されているかに依存します。

Fortran 95/90 の配列ポインタと形状引継ぎ配列は,配列記述子のアドレスを渡すことによって渡されます。

Fortran 95/90 のポインタと文字列の渡し方に対する属性の影響については,「Fortran 95/90 配列ポインタと割付け配列の処理」と,「文字列の処理」を参照してください。