1. 導入:なぜインデックスの「退避」が必要なのか?
COBOLでテーブル(配列)を扱う際、SEARCH文やPERFORM文でインデックスを操作することは日常茶飯事です。しかし、複雑な処理になると、「現在の検索位置を保持したまま、別の位置へ一時的に移動し、後で元の位置に戻したい」という場面に直面します。この「現在の位置をコピーして保存しておく」という操作は、バックトラック(やり直し)処理や、テーブル内の範囲比較を行う際に非常に重要なスキルとなります。
2. 基礎知識:インデックス(INDEX)とSET文の役割
COBOLにおける「インデックス」とは、テーブル内の要素を指し示すための特殊なデータ項目です。通常の数値項目(PIC 9など)とは異なり、コンパイラがメモリ上のオフセットを直接計算するために最適化されています。
このインデックスを操作する際、ADDやSUBTRACTではなく、専用の「SET文」を使用するのがCOBOLの鉄則です。SET文を使うことで、インデックスの整合性を保ちながら、安全に値をコピーしたり、増減させたりすることが可能になります。
3. 実装・解決策:SET文による値のコピー
インデックスを別のインデックスにコピーするには、以下の構文を用います。
SET [コピー先インデックス] TO [コピー元インデックス]
この操作を行うことで、コピー元のインデックスが現在指し示している「内部的なオフセット値」が、そのままコピー先に複製されます。これにより、ループ処理の途中で現在の位置を保存(セーブ)し、別のサブ処理が終わった後に元の位置へ復帰させることが可能になります。
4. サンプルプログラム:インデックスの退避と復帰
以下のコードは、テーブル検索中に一時的な位置を保存し、処理後に元の位置に戻す典型的なパターンです。
IDENTIFICATION DIVISION.
PROGRAM-ID. IDX-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 TABLE-DATA.
05 FILLER PIC X(10) VALUE “APPLE “.
05 FILLER PIC X(10) VALUE “ORANGE “.
05 FILLER PIC X(10) VALUE “BANANA “.
05 TABLE-ITEM OCCURS 3 TIMES INDEXED BY WS-IDX-CUR.
01 WS-IDX-SAVE INDEX. > インデックスを保存するための変数
PROCEDURE DIVISION.
> 1. 現在のインデックスを2番目にセット
SET WS-IDX-CUR TO 2.
> 2. 現在の位置をWS-IDX-SAVEに退避させる
SET WS-IDX-SAVE TO WS-IDX-CUR.
DISPLAY “現在の位置: ” WS-IDX-CUR.
> 3. 別の処理のためにインデックスを移動
SET WS-IDX-CUR TO 3.
DISPLAY “移動後の位置: ” WS-IDX-CUR.
> 4. 退避させておいた位置へ戻す(復帰)
SET WS-IDX-CUR TO WS-IDX-SAVE.
DISPLAY “復帰後の位置: ” WS-IDX-CUR.
STOP RUN.
5. 応用・注意点:現場で役立つポイント
・インデックスの初期化を忘れずに
インデックスは数値項目と異なり、宣言しただけでは値が不定です。必ずSET文で初期値を設定してから使用してください。
・数値項目への代入に注意
インデックスの値をPIC 9の項目に代入したい場合は、SET文ではなくMOVE文を使用します(環境によってはコンパイルエラーになる場合があるため、マニュアルを確認してください)。逆に、数値からインデックスへ値を移す場合もSET文を使用します。
・デバッグのコツ
複雑なテーブル操作で期待通りの動きをしない場合、必ず「退避したインデックスの値」と「現在のインデックスの値」をDISPLAY文で出力して確認してください。インデックスはメモリのオフセットを保持しているため、直感的な数値とは異なる場合があることを念頭に置くと、トラブル解決が早まります。

コメント