Cray ポインタとは、別のエンティティーのアドレスを値に持つ変数のことです。この別の言語要素のことを、「指示先」と呼びます。
f95 は、 Cray ポインタをサポートしていますが、標準の Fortran 95 はサポートしていません。
Cray ポインタの POINTER 文は次の形式で記述します。
POINTER ( pointer_name, pointee_name [array_spec] ), …
pointer_name、pointee_name、array_spec のそれぞれの意味は、次のとおりです。
対応する pointee_name へのポインタです。
pointer_name には pointee_name のアドレスが含まれます。pointer_name にはスカラー変数名を指定してください (構造型は指定できません)。禁止事項: 定数、構造体の名前、配列、または関数。
対応する pointer_name の指示先です。
制限事項 : 変数名、配列の宣言子、配列名を指定してください。
array_spec を指定する場合は、明示的な実体があるもの (定数または非定数のサイズを持つもの)、または仮のサイズを持つものを指定してください。
例: 2 つの指示先に対して Cray ポインタを宣言できます。
POINTER ( p, b ), ( q, c )
前述の例では、Cray ポインタ p とその指示先 b、Cray ポインタ q とその指示先 c を宣言しています。
例: 配列に対して Cray ポインタを宣言することもできます。
POINTER ( ix, x(n, 0:m) )
この例では、Cray ポインタ ix とその指示先 x を宣言しています。同時に、x は n × m+1 次元の配列であることを宣言しています。
ポインタを使用すると、記憶領域の特定の場所に変数を動的に対応付け、ユーザーが管理する記憶領域にアクセスすることができます。
Cray ポインタでは、メモリーの絶対アドレスにアクセスすることができます。
POINTER ( pointer_name, pointee_name [array_spec] )
Fortran 95 のポインタは次のように宣言します。
POINTER object_name
この 2 種類のポインタを混在させることはできません。
指示先が引用されるたびに、f95 はポインタの現在の値を指示先のアドレスとして使用します。
Cray ポインタ型の文では、ポインタと指示先の両方を宣言します。
Cray ポインタは Cray 型のポインタです。
Cray ポインタの値は、32 ビットプロセッサ上で領域の 1 単位を占め、64 ビットプロセッサ上で領域の 2 単位を占めます。
Cray ポインタは COMMON の並びまたは仮引数で使用することができます。
Cray ポインタの値が定義されるまでは、指示先にアドレスはありません。
指示先として配列が指定されている場合、その配列を「指示先配列」と呼びます。
この場合の配列の宣言子は次の場所に指定することができます。
独立した型宣言文
独立した DIMENSION 文
ポインタ文自体
配列の宣言子が副プログラムにある場合、次元の設定は次の場所で確認できます。
共通ブロックにある変数
仮引数である変数
各次元のサイズは、指示先が引用される時ではなく、副プログラムの処理が始まる時に認識されます。
pointee_name は、CHARACTER*(*) で型宣言された変数であってはいけません。
pointee_name が配列の宣言子である場合は、明示的な実体があるもの (定数または非定数のサイズを持つもの)、または仮のサイズを持つものでなければいけません。
Cray ポインタを配列にすることはできません。
Cray ポインタを次のように扱うことはできません。
別の Cray ポインタまたは Fortran ポインタの指示先にする。
構造体の成分にする
ほかのデータ型で宣言する
Cray ポインタを次の場所で使用することはできません。
PARAMETER 文または PARAMETER 属性を含む型宣言文
DATA 文。
Cray ポインタの指示先を、SAVE、DATA、EQUIVALENCE、COMMON、PARAMETER 文で使用することはできません。
Cray ポインタの指示先を仮引数にすることはできません。
Cray ポインタの指示先を関数結果の変数にすることはできません。
Cray ポインタの指示先を構造体の名前または構造体成分にすることはできません。
Cray ポインタの指示先の型をファイナライズ可能にすることはできません。
Cray ポインタには次のようにして値を割り当てることができます。
絶対アドレスに設定します。
例: q = 0
整変数の加減式によって割り当てます。
例: p = q + 100
Cray ポインタは整数ではありません。Cray ポインタを実数変数に割り当てることはできません。
LOC 関数 (非標準) を使用して Cray ポインタを定義することができます。
例: p = LOC( x )
例: Cray ポインタの使用例
SUBROUTINE sub ( n ) COMMON pool(100000) INTEGER blk(128), word64 REAL a(1000), b(n), c(100000-n-1000) POINTER ( pblk, blk ), (ia, a ), ( ib, b ), & ( ic, c ), ( address, word64 ) DATA address / 64 / pblk = 0 ia = LOC( pool ) ib = ia + 4000 ic = ib + n ...
前述の例を説明します。
word64 は絶対アドレス 64 の内容を参照します。
blk はメモリーの最初の 128 ワードを占める配列です。
a は無名共通ブロックにある配列で、長さは 1,000 です。
b は a のあとに位置し、長さは n です。
c は b のあとに位置します
a、b、c は pool 領域に関連付けられています
word64 は blk(17) と同じです。Cray ポインタはバイトアドレスであり、blk の整数要素はそれぞれ 4 バイトの長さがあるためです。