配列と構造体 (さらにはスカラー) は、配列の範囲 (上限や下限)、文字列 (CHAR、GRAPHIC、WIDECHAR、BIT) の長さ、AREA サイズがコンパイル時に不明である場合、調整可能であるとされていますが、プログラム ロジックに基づき実行時に決定されます。このようなデータは、REFER オプション付きの BASED 記憶域クラスを使用した、または BASED または AUTOMATIC 記憶域クラスを使用した、ランタイム式を使用して宣言できます。このような構造体によって定義されたデータを I/O 文を使用して送信する場合、REFER 付きの BASED の方が安全なアプローチであり、常に正しい方法です。
REFER 付き BASED 記憶域の例:
dcl (an, cn) fixed bin(31), DCL p ptr; dcl 1 s based(p), 3 x char(4) init('PL/I'), 3 (as,cs) fixed bin(31), 3 array(an refer(as)) char(cn refer(cs)); an = 12; cn = 16; allocate s;
最後かつ唯一のメンバーを調整可能にすることは、最も効率的な方法です。REFER の数が多いほど、生成されたコード シーケンスはより長くデータを操作します。複雑な使用をすると代償が伴いますが、場合によってはその価値は十分にある点に注意してください。
REFER なしの BASED 記憶域の例:
dcl (an, cn) fixed bin(31), DCL p ptr; dcl 1 s based(p), 3 x char(4) init('PL/I'), 3 array(an) char(cn); an = 12; cn = 16; allocate s;
スカラーの例:
dcl (an) fixed bin(31); an = 12; begin; dcl work char(cn); /* ... */ end;
このような使い方は、ほとんどの場合単純な REFER の数を自然と最低限に抑えることができるため、最も効率的な例です。