【COBOL学習|豆知識】COBOLの達人が教える!「相対添字」でループ処理をスマートに書くコツ

導入:なぜ「相対添字」が重要なのか

COBOLの現場では、配列(テーブル)を扱う機会が非常に多いですが、ループ処理の中で「一つ先の要素」や「一つ前の要素」を参照したいというケースに頻繁に遭遇します。通常であれば、添字(インデックス)を算術演算で加減算してから参照しますが、これでは一時的な変数操作が増え、コードの可読性が落ちたり、バグの温床になったりすることがあります。そんな時に役立つのが「相対添字」です。この手法を使えば、余計な加算命令を書くことなく、簡潔にロジックを表現できます。

基礎知識:添字と相対添字の仕組み

COBOLの配列参照において、添字とは「テーブルの何番目の要素か」を指定する値のことです。通常は「WS-TABLE(WS-IDX)」のように記述しますが、相対添字とは、その添字に直接オフセット(加減算する値)を記述する手法です。
具体的には「データ名(添字 + n)」や「データ名(添字 – n)」という形式をとります。注意点として、これはコンパイル時に動的に計算されるため、メモリの範囲外(添字の範囲外)を参照しないよう、ループの境界条件には十分な配慮が必要です。

実装・解決策:スマートな記述の極意

例えば、現在の要素と次の要素を比較して、値が昇順かどうかをチェックするロジックを考えてみましょう。相対添字を使えば、わざわざ「ADD 1 TO WS-IDX」としてから比較し、また元に戻すといった冗長な記述が不要になります。これにより、コードの行数を削減できるだけでなく、ロジックの意図が「現在の要素と次の要素の比較」であると一目で伝わるようになります。

サンプルプログラム

以下のコードは、テーブル内の隣接する要素を比較する簡単な例です。

IDENTIFICATION DIVISION.
PROGRAM-ID. RELATIVE-SUBSCRIPT-SAMPLE.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TABLE-AREA.
05 WS-TBL PIC X(05) OCCURS 5 TIMES.
01 WS-IDX PIC 9(01) VALUE 1.

PROCEDURE DIVISION.
> 初期値の設定
MOVE “A0001” TO WS-TBL(1)
MOVE “A0002” TO WS-TBL(2)
MOVE “A0003” TO WS-TBL(3)
MOVE “A0004” TO WS-TBL(4)
MOVE “A0005” TO WS-TBL(5)

> 相対添字を使用して、現在の要素と次の要素を表示する
PERFORM VARYING WS-IDX FROM 1 BY 1 UNTIL WS-IDX > 4
DISPLAY “現在: ” WS-TBL(WS-IDX)
” 次の値: ” WS-TBL(WS-IDX + 1)
END-PERFORM.

STOP RUN.

応用・注意点:現場で陥りやすい罠

相対添字を使う際に最も注意すべきは、添字の範囲外参照(サブスクリプト・レンジ・エラー)です。上記のサンプルでは、ループの終了条件を「WS-IDX > 4」とすることで、(WS-IDX + 1)が最大値の5を超えないように制御しています。もし条件を「UNTIL WS-IDX > 5」にしてしまうと、最後のループで(5 + 1 = 6)を参照しようとし、プログラムが異常終了したり、予期せぬメモリ領域を読み込んで誤動作したりする可能性があります。
また、コンパイラや環境によっては、相対添字の記述がサポートされていない古い規格や方言が存在する場合もあります。現場のコーディング規約を確認しつつ、境界値チェックを厳格に行うことが、ベテラン技術者の作法と言えるでしょう。

コメント

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