1. 導入:なぜ「指標名」はそのまま渡せないのか
COBOL開発において、テーブル(配列)操作に欠かせないのが「指標名(Index-name)」です。しかし、ベテランの私でも時折見かけるのが、この指標名をそのまま別プログラムへCALL文の引数として渡そうとしてコンパイルエラーや予期せぬ挙動に悩む若手エンジニアの姿です。
指標名はメモリ上の物理的な位置情報(オフセット値)を保持する特殊なデータ形式であり、コンパイル単位ごとに管理されています。そのため、呼び出し先プログラムに渡しても、呼び出し先のメモリ空間では「何番目の要素か」を正しく解釈できません。この制約を理解し、安全にデータを連携する方法を身につけましょう。
2. 基礎知識:指標名と数値項目の違い
指標名は、OCCURS句で定義されたテーブルの要素を指し示すために使用されます。通常の数値項目(PIC 9)が「値そのもの」を格納するのに対し、指標名は「テーブル内の相対的な位置」を保持します。
このため、指標名を別のプログラムに渡す際には、一度「通常の数値項目」に変換するというステップが不可欠です。この「変換」には、COBOLのSET文を使用します。
3. 実装・解決策:SET文による変換と受け渡し
解決策はシンプルです。「呼び出し元」で指標の値をPIC 9のデータ項目にコピーし、そのデータ項目を引数として渡すことです。呼び出し先では、受け取った数値項目を再び指標名にSETし直すことで、指標として利用可能になります。
4. サンプルプログラム
以下に、指標を安全に引き渡すための実装例を示します。
【呼び出し元(Main)】
IDENTIFICATION DIVISION.
PROGRAM-ID. MAINPROG.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 TABLE-INDEX INDEX.
01 SEND-INDEX PIC 9(04).
…
PROCEDURE DIVISION.
> 指標を数値項目へ変換
SET SEND-INDEX TO TABLE-INDEX.
> 数値項目を引数として渡す
CALL ‘SUBPROG’ USING SEND-INDEX.
…
【呼び出し先(Sub)】
IDENTIFICATION DIVISION.
PROGRAM-ID. SUBPROG.
DATA DIVISION.
LINKAGE SECTION.
01 RECV-INDEX PIC 9(04).
01 MY-TABLE-IDX INDEX.
PROCEDURE DIVISION USING RECV-INDEX.
> 受け取った値を指標へセットし直す
SET MY-TABLE-IDX TO RECV-INDEX.
> これで呼び出し先でもテーブル操作が可能になる
DISPLAY ‘現在の指標値: ‘ MY-TABLE-IDX.
EXIT PROGRAM.
5. 応用・注意点:現場でのトラブル回避
現場でよくある失敗は、受け取り側の数値項目の桁数が不足しているケースです。指標が指し示す範囲(OCCURS句の最大値)を考慮し、受け取り側のPIC句は十分な長さを確保してください。
また、「指標の再セット」を忘れるバグにも注意が必要です。呼び出し先で指標を使用する際は、必ずSET文を実行する癖をつけておきましょう。指標名はポインタのような性質を持つため、初期化や更新のタイミングを制御することは、堅牢なCOBOLプログラムを書くための第一歩です。

コメント