オフセット・データは、必ず区域変数と一緒に使われます。 オフセット変数の値は、区域変数内での基底付き変数の位置を、その 区域変数の開始位置からの変位として示します。 基底付き変数は相対的な位置で示されるので、区域変数が主記憶域の 別の部分に割り当てられても、オフセット値は無効になりません。
オフセット変数を使用しても、区域内でポインター変数を使用できなくなる わけではありません。
|
区域変数とオフセット変数の関連付けは、永続的なものではありません。 POINTER 組み込み関数を使用すれば、オフセット変数を任意の区域変数に 関連付けることができます (ロケーターの変換を参照)。 このような関連付けを宣言しておくことの利点は、このオフセット変数を参照すると、関連付けられている区域変数を参照することになるという点です。 区域変数の指定を省略すると、このオフセット変数は、POINTER 組み込み関数の使用を介してしかロケーター修飾子として使用することができません。
オフセット変数の値は、下記のいずれかの方法でセットすることができます。
区域変数の指定を省略したときは、そのオフセット変数は、POINTER 組み込み関数の使用を介してロケーター修飾子として使用することしかできません。
次の例を考えてみてください。
dcl X based(O),
Y based(P),
A area,
O offset(A);
allocate X;
allocate Y in(A);
区域 A とオフセット O のストレージ・クラスは、デフォルトによって AUTOMATIC になります。 最初の ALLOCATE ステートメントは、次のステートメントと同等です。
allocate x in(A) set(O);
2 番目の ALLOCATE ステートメントは、次のステートメントと同等です。
allocate Y in(A) set(P);
次の例は、オフセット変数を使用して区域変数内にリストを作成するときの方法を示しています。
dcl A area,
(T,H) offset(A),
1 STR based(H),
2 P offset(A),
2 data;
allocate STR in(A);
T=H;
do loop;
allocate STR set(T->P);
T=T->P;
·
·
·
end;