【COBOL学習|初心者向け】COBOLの達人が教える!OCCURS項目を自在に操る「REDEFINES」の極意

導入:なぜOCCURSの再定義が重要なのか

COBOL開発の現場では、大量のデータを配列(OCCURS句)として扱うことがよくあります。しかし、配列の中身を一度にクリアしたいときや、別の形式として読み替えたいときに、一つずつ要素を操作するのは非常に面倒ですし、バグの温床にもなります。今回紹介する「OCCURS項目をREDEFINESする」というテクニックを使えば、配列を「集合体」として一括操作できるようになり、コードが劇的にスッキリします。

基礎知識:REDEFINESとOCCURSの役割

まずおさらいです。OCCURS句は、同じデータ形式を繰り返す「配列」を作るための命令です。一方、REDEFINES句は、同じメモリ領域に対して「別の名前」や「別の形式」を割り当てる命令です。
通常、REDEFINESは単一の項目に対して使いますが、実はOCCURSで定義された配列全体を一つの領域として再定義することも可能です。これにより、「個別の要素」として扱う面と、「一つの大きな塊」として扱う面の二面性を持たせることができるようになります。

実装/解決策:配列を一括操作するテクニック

配列を再定義する際のルールは非常にシンプルです。「配列のサイズ」と「再定義先のサイズ」を一致させること。例えば、1バイトの項目が10個ある配列(計10バイト)を再定義するなら、再定義先もPIC X(10)と指定します。
これにより、配列の初期化を「MOVE SPACE TO 再定義項目」のたった一行で完了させることができます。

サンプルプログラム

以下のコードをコピーして、コンパイルしてみてください。配列を個別に操作する手間がどれだけ省けるか実感できるはずです。

IDENTIFICATION DIVISION.
PROGRAM-ID. REDEFINE-SAMPLE.

DATA DIVISION.
WORKING-STORAGE SECTION.

  • 1バイトの項目が10個並んだ配列

05 WS-ARRAY-TABLE.
10 WS-ELEMENT PIC X OCCURS 10.

  • 上記配列を10バイトの文字列として再定義

05 WS-ARRAY-ALL REDEFINES WS-ARRAY-TABLE PIC X(10).

PROCEDURE DIVISION.

  • 1. 配列に値をセット

MOVE “ABCDEFGHIJ” TO WS-ARRAY-ALL.
DISPLAY “セット後: ” WS-ARRAY-ALL.

  • 2. 配列を一括クリア(これが一番の利点です)

MOVE SPACE TO WS-ARRAY-ALL.
DISPLAY “クリア後: ” WS-ARRAY-ALL.

  • 3. 個別にアクセスしてみる

MOVE “Z” TO WS-ELEMENT(1).
DISPLAY “個別操作後: ” WS-ARRAY-ALL.

STOP RUN.

応用・注意点:現場での活用と落とし穴

このテクニックは、特にファイル入出力や通信電文の処理で威力を発揮します。固定長レコードを扱う際、特定の範囲を「配列として処理したいとき」と「電文全体として送信したいとき」を切り替えるのに最適です。

ただし、注意点があります。REDEFINESした領域のサイズが元の領域と合っていない場合、予期せぬメモリ破壊や読み込みエラーが発生します。特に日本語(日本語文字は2バイト以上)を含む場合、バイト数と文字数の計算ミスに注意してください。常に「メモリ上のバイト数」が一致しているかを意識するのが、ベテランの作法です。

コメント

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