1. 導入
メインフレームのPL/I開発において、配列のサイズをハードコーディングしていませんか?配列の境界値を直接数値で指定することは、仕様変更時の修正漏れや、配列の境界超過(Subscript Range Error)を引き起こす最大の要因です。本稿では、実行時に配列のサイズを動的に取得する組み込み関数、LBOUNDとHBOUNDの活用法を解説します。これらを使いこなすことで、サブルーチンの汎用性が飛躍的に高まり、保守性の高いコードを実現できます。
2. 基礎知識
PL/Iにおける「想定境界配列(Assumed-bounds array)」とは、サブルーチンの引数として受け取る際、サイズを「()」のように定義した配列を指します。この時、呼び出し元から渡された配列が具体的にどの範囲(下限値から上限値まで)を持っているのかを、呼び出された側で知る必要があります。
LBOUND(配列, 次元)は、指定した次元の「最小インデックス」を返し、HBOUND(配列, 次元)は「最大インデックス」を返します。現代言語の length プロパティと異なり、PL/Iでは「0から始まる配列」や「-10から始まる配列」なども定義可能なため、常にこれら関数で境界を取得する癖をつけることが重要です。
3. 実装/解決策
配列を処理するループを記述する際は、定数を使用せず、必ずLBOUNDとHBOUNDの結果をDOループの範囲に指定します。これにより、配列の定義が変更されても、サブルーチン側のロジックを修正する必要がなくなります。
4. サンプルプログラム
以下のコードは、任意のサイズを持つ配列を受け取り、その全要素を処理するサブルーチンの例です。
/ サブルーチン:配列の全要素を初期化する /
INITIALIZE_ARRAY: PROCEDURE(ARRAY_IN);
/ 想定境界配列として定義 /
DCL ARRAY_IN() FIXED BIN(31);
DCL I FIXED BIN(31);
/ LBOUNDとHBOUNDを使用して安全にループ /
DO I = LBOUND(ARRAY_IN, 1) TO HBOUND(ARRAY_IN, 1);
/ 境界を意識せず、取得した値で処理を実行 /
ARRAY_IN(I) = 0;
END;
END INITIALIZE_ARRAY;
5. 応用・注意点
現場でよく陥るバグとして、ループの開始値を「1」と決め打ちしてしまい、下限が0や負数の配列を渡した際に発生する「サブスクリプト範囲外エラー」があります。
また、多次元配列を扱う場合は、LBOUND(配列, 2)のように第2引数を正確に指定することを忘れないでください。
さらに、構造体内の配列に対してもこれらの関数は有効ですが、構造体自体に直接LBOUNDを適用することはできません。あくまで「配列要素」に対して使用してください。常に「配列の境界は実行時に解決するもの」という意識を持つことが、堅牢なメインフレームアプリケーション開発への近道です。

コメント