【COBOL学習|豆知識】COBOLでマトリックスを操る!「多重OCCURS」による二次元配列の活用術

なぜ「多重OCCURS」が重要なのか

COBOLの現場では、単なるリスト構造だけでは表現しきれないデータに出会うことが多々あります。例えば、「月別の曜日データ」や「拠点ごとの売上マトリックス」などです。これらを個別の変数で定義するとコードが煩雑になり、保守性が著しく低下します。多重OCCURS(二次元配列)を使いこなすことで、複雑な構造データをスマートに管理し、ループ処理による効率的なデータアクセスが可能になります。

基礎知識:二次元配列の仕組み

COBOLにおける二次元配列とは、OCCURS句の中にさらにOCCURS句を入れ子にした構造を指します。

  • 外側のOCCURS(行):データの大きなグループを定義します。
  • 内側のOCCURS(列):そのグループの中に含まれる詳細な項目を定義します。

アクセスする際は、添字をカンマで区切って記述します。数学の行列と同じく「行番号、列番号」の順で指定するのが一般的です。

実装と解決策

二次元配列を扱う際は、必ず「入れ子のPERFORM文」を使用します。外側のループで「行」を固定し、内側のループで「列」をスキャンすることで、マトリックス全体を網羅的に走査できます。

サンプルプログラム

以下のプログラムは、3行×4列の表形式データを定義し、値を設定して表示する例です。

IDENTIFICATION DIVISION.
PROGRAM-ID. MATRIX-SAMPLE.

DATA DIVISION.
WORKING-STORAGE SECTION.

  • 3行×4列の二次元配列を定義

05 WS-TABLE.
10 WS-ROW OCCURS 3 TIMES.
15 WS-COL OCCURS 4 TIMES PIC X(05).

05 I PIC 9 VALUE 0.
05 J PIC 9 VALUE 0.

PROCEDURE DIVISION.

  • データの初期化(代入)

PERFORM VARYING I FROM 1 BY 1 UNTIL I > 3
PERFORM VARYING J FROM 1 BY 1 UNTIL J > 4
MOVE “DATA” TO WS-COL(I, J)
END-PERFORM
END-PERFORM.

  • データの表示

PERFORM VARYING I FROM 1 BY 1 UNTIL I > 3
DISPLAY “行番号:” I ” | ”
PERFORM VARYING J FROM 1 BY 1 UNTIL J > 4
DISPLAY ” 列” J “:” WS-COL(I, J)
END-PERFORM
END-PERFORM.

STOP RUN.

応用・注意点

現場で最も注意すべきは「添字の範囲外参照」です。OCCURSで定義した回数を超えて添字を指定すると、メモリ上の別の領域を破壊し、予期せぬバグを引き起こします。

  • ガード条件の徹底:ループの終了条件(UNTIL)は、必ずOCCURSで指定した回数と一致させてください。
  • パフォーマンス:極端に巨大な二次元配列を定義する場合、メモリ消費量に注意が必要です。必要最小限のサイズに留めるのがCOBOLプログラマの嗜みです。
  • 可読性:添字が3つ以上重なる多次元配列は可読性が極端に落ちます。その場合は、データ構造を見直すか、コメントを詳細に記述して意図を明確にしましょう。

コメント

タイトルとURLをコピーしました