Rational Developer for System z
Enterprise PL/I for z/OS, Version 3.8, 言語解説書

REFER オプション (自己定義データ)

自己定義構造体または共用体とは、それ自身のフィールドについての情報 (ストリング の長さなど) を含んでいる構造体または共用体です。 このデータを処理できるように、基底付き構造または共用体を宣言することが できます。 ストリングの長さ、配列の境界、区域のサイズはすべて、構造体内または共用体内で 宣言した変数 (参照オブジェクト) によって定義することができます。 その構造体または共用体が割り振られる (ALLOCATE ステートメントまたは LOCATE ス テートメントによって) とき、式の値が参照オブジェクト変数に割り当てられます。 それ以外にこの構造体または共用体を参照したときは、参照オブジェクトの値が使われます。

基底付き構造体または共用体を宣言するときに REFER オプションを指定して、その 構造体または共用体を割り振る時点で式の値を参照オブジェクトに割り当てるこ と、およびその式の値で構造体内または共用体内の別の変数の長さ、境界、もし くはサイズを表すことができます。 REFER オプションで長さ、境界、またはサイズを指定する場合の構文は次のとおりです。

構文図を読む構文図をスキップする>>-expression--REFER--(member-variable)------------------------><
 
expression
この expression (式) の値は、構造体または共用体が (ALLOCATE もしくは LOCATE を 使用して) 割り振られたときに、メンバーの長さ、境界、あるいはサイ ズを定義します。 この式が計算され、FIXED BINARY (31,0) に変換されます。 この式のオペランドとして使用する変数は、この REFER オプションを含んでいる 構造体または共用体に属していてはなりません。

構造体または共用体への後続の参照では、REFER オプションのメンバーの長さ、 境界、もしくはサイズを、member-variable (参照オブジェクト) の 現行値から獲得します。

member-variable
参照オブジェクトは、次の規則に従わなければなりません。

次の例の宣言では、基底付き構造体 STR が配列 Y と エレメント X で構成されていることを指定しています。

  declare 1 STR based(P),
            2 X fixed binary(31,0),
            2 Y (L refer (X)),
          L fixed binary(31,0) init(1000);

STR が割り振られるとき、上限は、X に割り当てられて いる L の現行値にセットされます。 ほかの場所 (P をセットするための READ ステートメントなど で) Y を参照すると、X に入っている制限値が使われます。

REFER オプションを持つメンバーに INITIAL 属性を指定すると、参照オブジェク トに値が割り当てられてから、メンバーの初期設定が行われます。

構造体または共用体の宣言で使用できる REFER オプションの数に制限はありません。

参照オブジェクトの値は、プログラムの実行中に変更してはなりません。 参照オブジェクトの値が変更された場合、集合などを解放するエラーが発生します。

また、REFER エクステントを定義する式の中で使用する変数は、 その REFER を使用する DECLARE を含むブロック (またはその親ブロック の 1 つ) 内で宣言されている必要があります。 変数のいずれかが宣言されていない場合、 その変数は暗黙宣言に関する通常の規則に従って暗黙的に宣言されます。 つまり、DECLARE を含む最外部のブロックに、 その変数の DECLARE が追加されます。

したがって、次のコードの中で、 サブルーチン inner_proc 内での変数 m の 宣言と割り当ては、ALLOCATE ステートメントに影響しません。 ALLOCATE ステートメントは、メイン・ブロックで暗黙的に宣言された 未初期化の m を使用します。

 refertst: proc options(main);

    dcl
      1 a based,
        2 n fixed bin(31),
        2 c char(m refer(n));

    call inner_proc;

    inner_proc: proc;

      dcl m fixed bin(31);
      dcl p pointer;

      m = 15;
      allocate a set(p);
    end;
  end;

Terms of use | Feedback

This information center is powered by Eclipse technology. (http://www.eclipse.org)