インテル® Fortran コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

Fortran 配列記述子の処理

標準の Fortran が複数のポインター・メモリー・アドレスを追跡しなければならない場合に備えて、インテル® Fortran コンパイラーは、配列の編成に関する詳細情報を格納する配列記述子を使用します。

(結合またはプロシージャー・インターフェイス・ブロックによる) 明示的なインターフェイスを使用する場合、コンパイラーは次の形式の配列引数記述子を生成します。

特定の種類の引数は、適切な明示的インターフェイスが提供されている場合でも、記述子を使用しません。例えば、明示的形状配列および大きさ引き継ぎ配列は記述子を使用しません。一方、配列ポインターおよび割付け配列は、引数として使用するかどうかにかかわらず、記述子を使用します。

インテル® Fortran と C/C++ の間で呼び出しを行う場合、暗黙的インターフェイスを使用することで、インテル® Fortran の記述子なしで配列を渡すことができます。ただし、呼び出されたルーチンがインテル® Fortran 記述子に含まれる情報を必要とする場合、ルーチンを明示的インターフェイスで宣言し、仮配列を形状引き継ぎ配列またはポインター属性として指定します。

Fortran 配列は、(配列境界が "矩形" である限り) 任意の形式で編成された任意のメモリー部分と関連付けることができます。また、Fortran 配列ポインターを C 言語に渡し、C 言語で記述子を正しく解釈して、必要な情報を取得することができます。

ただし、配列記述子を使用すると、エラーが起こる可能性が高くなります。また、対応するコードの移植性も損なわれます。

次に、IA-32 アーキテクチャーのシステム上における現在のインテル® Fortran の配列記述子のコンポーネントを示します。

次元数 1 の配列は、3 つの 4 バイトのエンティティーを追加する必要があるため、合計で 9 つの 4 バイトのエンティティー (6 + 3*1) が含まれ、バイト 35 で終わります。次元数 7 の配列は、合計で 27 の 4 バイトのエンティティー (6 + 3*7) が含まれ、バイト 107 で終わります。

宣言の例

   integer,target :: a(10,10)
  integer,pointer :: p(:,:)
  p => a(9:1:-2,1:9:3)
  call f(p)
...

実引数 p の記述子には、次の値が含まれます。

インテル® 64 アーキテクチャー・ベースのシステムの記述子は、IA-32 アーキテクチャー・ベースのシステムの記述子と同じ書式を使用しますが、すべてのフィールドが 4 バイトから 8 バイトになります。