Fortran、C、C++ および MASM の間でデータを渡すには、個々の言語で行う場合と同じように、引数の並びを使用します (例えば、CALL MYSUB(a,b,c) では a、b、および c が引数になります)。各引数を渡す方法には 2 通りあります。
値で渡す: 引数の値を渡します。
参照で渡す: 引数のアドレスを渡します。IA-32 アーキテクチャー・ベースのシステムでは、Fortran、C、および C++ は 4 バイト・アドレスを使用します。インテル® 64 および IA-64 アーキテクチャー・ベースのシステムでは、これらの言語は 8 バイト・アドレスを使用します。
すべての呼び出しに対して、呼び出し側のプログラムと呼び出される側のルーチンで、個々の引数の渡し方が一致していることを確認する必要があります。渡し方が一致していない場合は、呼び出されたルーチンは無効なデータを受け取ることになります。
Fortran での引数の渡し方は、指定した呼び出し規則によって変わります。デフォルトでは、Fortran はすべてのデータを参照で渡します (ただし、例外として文字列型の長さの隠し引数は値で渡されます)。
ATTRIBUTES C オプション (Windows* では STDCALL) オプションが使用された場合は、配列以外のすべてのデータを値で渡すようにデフォルト設定が変更されます。C オプションまたは STDCALL オプションに加えて、REFERENCE オプションもプロシージャーに対して指定されている場合は、デフォルトですべての引数が参照で渡されます。
また、引数オプションの VALUE および REFERENCE を指定することで、引数を値または参照で渡すことができます。言語が混在したプログラミングでは、デフォルト設定に頼るよりも、引数の渡し方を明示的に指定することをお勧めします。
Windows では、コンパイラー・オプションの /iface を使用することで、デフォルトの引数渡し規則を設定できます (文字列の隠された文字長など)。「ATTRIBUTES プロパティーと呼び出し規則」を参照してください。
C および MASM での参照渡しおよび値渡しの例を次に示します。いずれも、次に示すサンプルの Fortran サブルーチン TESTPROC へのインターフェイスです。TESTPROC の定義では、各引数の渡し方が宣言されています。この例では、REFERENCE オプションが必ずしも必要ではありませんが、このオプションを使用することで引数渡し規則が明確になります。
SUBROUTINE TESTPROC( VALPARM, REFPARM ) !DEC$ ATTRIBUTES VALUE :: VALPARM !DEC$ ATTRIBUTES REFERENCE :: REFPARM INTEGER VALPARM INTEGER REFPARM END SUBROUTINE
C および C++ では、配列以外のすべての引数が値で渡されます。配列の場合は、配列の第 1 メンバーのアドレスへの参照で渡されます。Fortran とは異なり、C および C++ は各引数の渡し方を指定する呼び出し規則宣言子を使用しません。配列以外の C のデータを参照で渡すには、そのデータへのポインターを渡す必要があります。また、C の配列を値で渡すには、配列を構造体のメンバーとして宣言し、その構造体を渡す必要があります。次の C の宣言では、サンプルの Fortran TESTPROC サブルーチンへの呼び出しを設定しています。
Linux*:
extern void testproc_( int ValParm, int *RefParm );
Windows:
extern void testproc_( int ValParm, int *RefParm );
MASM (Windows のみ) では、引数はデフォルトにより値で渡されます。参照で渡す引数は、PROTO 宣言子および PROC 宣言子の PTR で指定されます。次に例を示します。
TESTPROC PROTO, 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 (Windows では STDCALL) オプション |
スカラーおよび派生型 |
REFERENCE オプション |
デフォルト |
|
デフォルト |
配列 |
デフォルト |
値渡しは不可 |
|
C (Windows では STDCALL) オプション |
配列 |
デフォルト |
値渡しは不可 |
|
C/C++ |
配列以外 |
argument_name ポインター |
デフォルト |
|
配列 |
デフォルト |
Struct {type} array_name |
||
アセンブラー MASM (Windows のみ) |
すべての型 |
PTR |
デフォルト |
この表では、インテル® Fortran における文字列引数および Fortran 95/90 ポインター引数の渡し方については触れていません。これらの引数は、他の引数とは異なる形式で渡されるからです。Fortran はデフォルトで文字列を文字長とともに参照で渡します。文字長の位置は、コンパイラー・オプション -mixed-str-len-arg (Linux および Mac OS* X) または /iface:mixed_str_len_arg (Windows) が文字列の先頭アドレスの直後に指定されているかどうかによって異なります。さらに、-nomixed-str-len-arg (Linux および Mac OS X) または /iface:nomixed_str_len_arg (Windows) がすべての引数の後に指定されているかどうかによっても異なります。
Fortran 95/90 の配列ポインターおよび形状引き継ぎ配列は、配列記述子のアドレスを渡すことによって渡されます。
Fortran 95/90 のポインターおよび文字列の渡し方に対する属性の影響については、「配列ポインターと割付け配列の処理」および「文字列の処理」を参照してください。