【COBOL学習|豆知識】指標名(Index-name)を使いこなせ!INDEXED BY 句の賢い活用術

導入

COBOLでテーブル(配列)を扱う際、何気なく使っている「添字」ですが、皆さんはどのように管理していますか?単なる数値項目(PIC 9)を添字として使っていると、処理のたびに転記や計算が必要になり、コードが煩雑になりがちです。今回紹介するINDEXED BY句を活用すれば、テーブル操作がより直感的で、かつパフォーマンスに優れたものになります。なぜ重要かといえば、指標名を使うことでコンパイラが最適化を行いやすく、可読性も格段に向上するからです。

基礎知識

INDEXED BY句は、OCCURS句と同時に指定する記述項です。ここで指定した「指標名(Index-name)」は、通常のデータ項目とは異なり、USAGE INDEXという特殊な属性を持ちます。
最大の特徴は、この指標名が「そのテーブル専用のメモリ上のオフセット値」を直接保持している点です。通常の数値項目が「何番目か(1, 2, 3…)」というカウント値を保持するのに対し、指標名は「配列の先頭から何バイト目か」という相対アドレスに近い情報を持ちます。そのため、サーチ命令(SEARCH)などでは、数値項目を使うよりも高速に処理が行われます。

実装/解決策

実装は非常にシンプルです。テーブル定義の末尾に「INDEXED BY 指標名」を書き加えるだけです。
重要なポイントは、この指標名はデータ部(Data Division)で別途定義してはいけないという点です。定義しようとするとコンパイルエラーになります。あくまでOCCURS句の一部として「自動生成される」ものだと理解してください。

サンプルプログラム

以下のサンプルは、INDEXED BYで定義した指標名を使用して、テーブル内の特定要素を検索する標準的な例です。

01 WS-TABLE-AREA.
05 WS-ITEM OCCURS 5 TIMES INDEXED BY WS-IDX.
10 WS-CODE PIC X(02).
10 WS-NAME PIC X(10).

PROCEDURE DIVISION.

  • 検索用に指標を初期化(SET文を使用)

SET WS-IDX TO 1.

  • SEARCH文でテーブルを検索(指標名が自動的に加算される)

SEARCH WS-ITEM
AT END DISPLAY ‘見つかりませんでした’
WHEN WS-CODE(WS-IDX) = ‘A1’
DISPLAY ‘対象データを発見しました:’ WS-NAME(WS-IDX)
END-SEARCH.

  • 指標を直接操作する場合はSET文を使用

SET WS-IDX UP BY 1.
DISPLAY ‘次の要素へ移動しました。現在の添字位置:’ WS-IDX.

応用・注意点

現場での開発で陥りやすい落とし穴をいくつか共有します。

1. SET文の活用: 指標名に対しては、ADDやSUBTRACTではなく、必ずSET文(SET WS-IDX UP BY 1など)を使用してください。これは指標名が数値項目ではないためです。
2. サブルーチンへの引渡し: 指標名を別のプログラムへ渡すことはできません。もし複数のプログラムで同じテーブル位置を共有したい場合は、指標名ではなく、指標の値を数値項目に変換してから受け渡す必要があります。
3. 範囲外アクセス: 指標名を使用した際、OCCURSの最大値を超えて操作してもエラーにならない環境が多いです。ループ処理の際は、必ずテーブルの境界を意識してください。

指標名を正しく使いこなすことは、ベテランCOBOLプログラマへの第一歩です。ぜひ次回のコーディングから取り入れてみてください。

コメント

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