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