配列と Fortran 配列記述子の処理

Fortran 95/90 では、配列を配列要素、配列サブセクション、または配列名で参照される配列全体として渡すことができます。Fortran では、配列要素は列優先順に編成されていて、最初の添字 (次元) から優先されます。

Fortran と他の言語の間で配列を使用する場合、要素のインデックスと順序を考慮する必要があります。配列要素は個別に参照し、追跡する必要があります。Fortran および C では、配列要素のインデックス付けの方法が異なります。配列のインデックス付けは、ソースレベルでの問題であり、下位のデータに違いはありません。

Fortran および C の配列は、次の 2 つの点で異なります。

C では、X[3][3] として宣言されている配列の最初の 4 つの要素は次のとおりです。

  X[0][0] X[0][1] X[0][2] X[1][0]

一方、Fortran では、最初の 4 つの要素は次のとおりです。

  X(1,1) X(2,1) X(3,1) X(1,2)


インデックスの順序は、次元をいくつ宣言しても同じです。例えば、次の C の宣言の場合、

int arr1[2][10][15][20];

これは Fortran の次の宣言に相当します。

INTEGER arr1( 20, 15, 10, 2 )


C の配列宣言に使用される定数は、他の言語のように上限ではなく、範囲を表しています。このため、int arr[5][5] と宣言された C 配列の最後の要素は、arr[5][5] ではなく arr[4][4] となります。

次の表に、対応する配列宣言を示します。

異なる言語で対応する配列宣言

言語

配列宣言

Fortran からの配列参照

Fortran

DIMENSION x(i, k)
または
type
x(i, k)

x(i, k)

C/C++

type x[ k ] [ i ]

x( i -1, k -1)

インテル® Fortran の配列記述子の書式

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

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

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

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

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

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

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

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

例えば、次のような宣言の場合を考えてみます。

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


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

Itanium ® ベース・システムの指定子の書式は、IA-32 システムの書式と同じですが、すべてのフィールドが 4 バイトから 8 バイトになります。