Fortran と C,Visual C++,Visual Basic,および MASM の間でデータを渡すには,個々の言語で行う場合と同じように,呼び出し引数並びを使用することができます (たとえば,CALL MYSUB(a,b,c) 中の引数並び a,b,c)。個々の引数を渡す方法は 2 つあります。
引数の値を渡します。
引数のアドレスを渡します。Fortran,Visual Basic,C,および Visual C++ では,ia32 システムと ia64 システムの両方で,すべてのアドレスが 4 バイトです。
すべての呼び出しについて,呼び出し側のプログラムと呼び出される側のルーチンで,個々の引数の渡し方が一致していることを確認する必要があります。さもないと,呼び出されたルーチンは無効なデータを受け取ることになります。
Fortran 引数の渡し方は,指定された呼び出し規約によって変わります。基本設定では,Fortran はすべてのデータを参照で渡します。例外として,文字列の隠された文字長引数は,値で渡されます。
ATTRIBUTES C または STDCALL オプションが使用されると,基本設定は,配列以外はすべて値で渡すように変わります。手続に対して C または STDCALL オプションに加えて REFERENCE オプションが指定されている場合,すべての引数が基本設定では参照で渡されます。
Fortran では,呼び出し規約オプションの C と STDCALL による引数渡しの設定に加えて,引数オプション VALUE と REFERENCE を指定して,引数を値または参照で渡すことができます。言語が混在したプログラミングでは,基本設定に頼るよりも,渡し方を明示的に指定する方がいいでしょう。
次に,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
Fortran と C での引数の値渡しと参照渡し
C と Visual C++ では,配列以外のすべての引数が値で渡されます。配列の場合,配列の第 1 メンバのアドレスが参照で渡されます。Fortran とは異なり,C と Visual C++ は,個々の引数が渡される方法に影響を与える呼び出し規約命令を持っていません。配列以外の C のデータを参照で渡すためには,そのデータへのポインタを渡す必要があります。C の配列を値で渡すためには,それを構造体メンバとして宣言し,その構造体を渡さなくてはなりません。次の C の宣言は,サンプルの Fortran TESTPROC サブルーチンへの呼び出しを設定します。
extern void __stdcall TESTPROC( int ValParm, int *RefParm );
Fortran と Visual Basic での引数の値渡しと参照渡し
Visual Basic では,引数は基本設定では参照で渡されます。引数を値で渡すには,DECLARE 文の引数の前に BYVAL キーワードを使用します。次に例を示します。
Declare Sub TESTPROC Lib "C:\f90\TESTPROC.DLL" \ (ByVal Valparm As Long, Refparm As Long)
文字列は特殊なケースです。「文字列の処理」の文字列に関する説明を参照してください。
Fortran と MASM での引数の値と参照渡し例
MASM では,引数は基本設定では値で渡されます。参照で渡す引数は,PROTO および PROC 命令の PTR で指定されます。次に例を示します。
TESTPROC PROTO STDCALL, valparm: SDWORD, refparm: PTR SDWORD
値で渡される引数を使用するには,変数の値を使用します。次に例を示します。
mov eax, valparm ; Load value of argument
この文は,valparm の値を EAX レジスタに格納します。
参照で渡される引数を使用するには,変数のアドレスを使用します。次に例を示します。
mov ecx, refparm ; Load address of argument mov eax, [ecx] ; Load value of argument
これらの文は,refparm の値を EAX レジスタに格納します。
次表に,引数を参照と値で渡す方法を要約します。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 配列ポインタと割付け配列の処理」と,「文字列の処理」を参照してください。