OFFSET 属性は、領域内の基底付き変数の位置を指定するために使用されるロケーター データ型を記述します。OFFSET 属性の形式は次のとおりです。
OFFSET [(area-variable)]
オフセット変数は、領域変数と併用する場合のみ使用されるロケーターです。オフセット変数の値により、当該の領域内の基底付き変数の位置が、領域の冒頭からの相対位置で指定されます。オフセット値は相対位置を示すため、領域が記憶域の別の領域に割り当てられても値は有効なままです。
オフセット変数を使用して特定の基底付き変数を識別するには、オフセット変数を領域に関連付ける必要があります。次に例を示します。
DECLARE A AREA, O OFFSET(A), X FIXED BASED(O), Z OFFSET, P POINTER; ALLOCATE X IN(A) SET(O); X = 5; /* Implies area and offset */
この関連付けは、前の例に示すように、領域変数を指定することによって宣言で行うことができます。このような宣言を使用すると、ロケーターとして使用されるオフセット変数を参照したときに、関連付けられた領域が暗黙的に参照されるため便利です。
オフセット値を別のオフセット変数に割り当てたり別のオフセット変数と比較するときは、実際の値のみが使用され、暗黙的な領域の参照は無視されます。ただし、オフセット値をロケーターとして使用する場合やポインターと比較したりポインターに割り当てるときは、オフセット値から派生したアドレスとオフセット値が関連付けられている領域のアドレスを組み合わせて生成されるポインターに暗黙的に変換されます。この関連付けが宣言で行われていない場合、POINTER 組み込み関数を使用して行うこともできます。
P = POINTER(Z, A); /* offset Z was not associated with area A in its declaration */
オフセット変数の宣言で領域の関連付けが行われていなかった場合は、POINTER 組み込み関数でのみ、領域内の変数をアドレス指定するロケーターとしてオフセット変数を使用できることに注意してください。詳細については、「Open PL/I の組み込み関数」の章の「POINTER」のセクションで POINTER 組み込み関数の説明を参照してください。
OFFSET 変数の値は次の方法で割り当てることができます。
次に例を示します。
DECLARE X FIXED BIN(31 BASED(01), Al AREA, 01 OFFSET(A1); ALLOCATE X; /*sets 01 = to the offset of X in area A1 */
X のロケーターと関連付けられた領域 01 の両方がそれぞれの宣言で指定されているため、最初の ALLOCATE 文は次の文と同等です。
ALLOCATE X IN(A1) SET(01);