インテル® Fortran コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
これらは、互換性保持のためのプロシージャー・インターフェイスで、形状引き継ぎ配列、文字長引き継ぎ、あるいは ALLOCATABLE、POINTER、または OPTIONAL 属性の仮引数を指定します。
ランク引き継ぎオブジェクトは、ランクが実引数から引き継がれる仮引数です。任意のランクの引数を受け付ける C 関数との互換性を保持します。組込み関数 RANK を使用して、ランク引き継ぎ変数のランクを取得できます。
ランク引き継ぎ仮引数が含まれる場合、プロシージャーには明示的なインターフェイスが必要です。
SHAPE、SIZE、UBOUND 組込み関数は、大きさ引き継ぎ配列に関連付けられたランク引き継ぎ配列用に定義されています。
ランク引き継ぎ仮引数は、任意のランクの実引数に対応できます。実引数のランクが 0 の場合、仮引数のランクは 0 になります。形状はサイズが 0 の配列となり、LBOUND と UBOUND 組込み関数 (DIM 引数なし) はサイズ 0 の配列を返します。実引数のランクが 0 よりも大きい場合、仮引数のランクと範囲は、大きさ引き継ぎ配列の最終範囲がないことも含め、実引数から引き継がれます。実引数が配列で、仮引数が ALLOCATABLE または POINTER 属性を持つ場合、仮引数の境界は実引数から引き継がれます。
型引き継ぎオブジェクトは、TYPE(*) として宣言される仮引数です。C の (void *) 型の仮引数との互換性を提供します。
型引き継ぎ仮引数は多相なため、型引き継ぎ仮引数を含むプロシージャーには明示的なインターフェイスが必要です。
型引き継ぎ仮引数は、型引数、型バインド・プロシージャー、または最終サブルーチンを持つ派生型の実引数と一致してはなりません。
C 記述子は、ISO_Fortran_binding.h ファイルで定義されている CFI_cdesc 型の C 構造体です。
プロシージャーに対して BIND(C) を指定する場合、各仮引数は互換性のあるプロシージャーか、変数 (互換性がある、形状引き継ぎ、ランク引き継ぎ、型引き継ぎ、文字長引き継ぎ、または ALLOCATABLE あるいは POINTER 属性) でなければなりません。関数に対して BIND(C) を指定する場合、関数の結果は互換性のあるスカラー変数でなければなりません。
BIND(C) プロシージャーの仮引数は、OPTIONAL 属性と VALUE 属性の両方を持つことはできません。
BIND(C) プロシージャーの仮引数である変数は、互換性のある型か引き継ぎ型でなければなりません。
Co-Array は、BIND(C) プロシージャーの仮引数に指定できません。
ALLOCATABLE または POINTER 属性は、BIND(C) プロシージャーのデフォルトで初期化される仮引数では指定できません。
ASYNCHRONOUS 属性を持つ変数は、Fortran プロシージャーと C プロシージャー間の非同期通信に使用できます。
INTENT (OUT) 属性の割付け仮引数を持つ Fortran プロシージャーが C 関数によって呼び出され、C 関数の実引数が割り当てられた割付け変数を表す C 記述子のアドレスである場合、変数は Fortran プロシージャーの入口で解放されます。C 関数が INTENT (OUT) 属性の割付け仮引数を利用して Fortran プロシージャーから呼び出され、C 関数への参照の実引数が割り当てられた割付け変数の場合、変数は呼び出し時 (C 関数の実行前) に解放されます。
ISO_Fortran_binding.h で定義されている型、マクロ、関数は、C 記述子を解釈し、C 記述子によって表されるオブジェクトを割り当て/解放するために C 関数で使用できます。これらは、割付け、引き継ぎ文字長、ランク引き継ぎ、形状引き継ぎ、またはデータポインター仮引数を持つ Fortran インターフェイスと互換性を保持する C プロトタイプを指定するために提供されています。
ISO_Fortran_binding.h は、次の定義を含む C ヘッダーファイルです。
添字、境界、範囲、ストライドを表す関数引数の要素順は、C 記述子の dim メンバーの要素順と同じです。
Fortran プロシージャーと互換性を保持するための C 関数は、次の条件を満たしている必要があります。
ここで、変更とは C 記述子の場所または内容の変更 (作成と更新を含む) を指します。これらの制約事項は、アクティブな Fortran プロシージャーが常に同じ状態の C 記述子を利用できるようにし、Fortran コード側で C 記述子をコピーしなくても済むようにするためです。