本文へスキップ
BecomeCoder

COBOLコース · 第6章 表を扱う ― OCCURSと配列 · レッスン31

添字でアクセスする ― SUBSCRIPTとINDEXED BY

ローカル実施

導入

前のレッスンでは WS-SCORE(1) のように数値を直接書いて添字を指定しました。しかし実務では「変数を使って添字を動かしながら」表全体を処理することがほとんどです。この添字の指定方法には、大きく2つの流儀があります。

説明

1. SUBSCRIPT(通常の変数を添字として使う)

WORKING-STORAGE SECTIONで宣言した普通の数値項目を、添字として使えます。

       01  WS-SCORES.
           05  WS-SCORE         PIC 9(3)   OCCURS 5 TIMES.
       01  WS-IDX               PIC 9(2).

       PROCEDURE DIVISION.
           PERFORM VARYING WS-IDX FROM 1 BY 1 UNTIL WS-IDX > 5
               DISPLAY WS-SCORE(WS-IDX)
           END-PERFORM.

第5章で学んだ PERFORM VARYING と組み合わせて、WS-IDX を1から5まで動かしながら WS-SCORE(WS-IDX) にアクセスする——これがOCCURSを走査する最も基本的な形です。

2. INDEXED BY(専用のインデックスを使う)

OCCURS句に INDEXED BY を付けると、その表専用のインデックスを使えるようになります。

       01  WS-SCORES.
           05  WS-SCORE         PIC 9(3)   OCCURS 5 TIMES
                                            INDEXED BY WS-SCORE-IDX.

       PROCEDURE DIVISION.
           PERFORM VARYING WS-SCORE-IDX FROM 1 BY 1
                   UNTIL WS-SCORE-IDX > 5
               DISPLAY WS-SCORE(WS-SCORE-IDX)
           END-PERFORM.
  • INDEXED BY WS-SCORE-IDXWS-SCORE-IDX というインデックス名を宣言します。これはPICTURE句を持つ普通の変数ではなく、コンパイラが内部的に管理する特別な仕組みです。
  • インデックスは、次のレッスンで学ぶ SEARCH 文とセットで使うと特に威力を発揮します。
  • 処理系によっては、インデックスを使ったアクセスのほうが、通常のSUBSCRIPTより高速に処理されることがあります(表の先頭からの相対位置を直接扱えるため)。

どちらを使うべきか迷ったら、まずは普通の数値変数(SUBSCRIPT)を使えば十分です。SEARCH文を使う場面になったら、INDEXED BYを検討する、という流れで問題ありません。

試すには

WS-SCORE OCCURS 5 TIMES INDEXED BY WS-IDX のように宣言し直し、SUBSCRIPT版と同じ結果になることを確認してみましょう。宣言の書き方は変わっても、WS-SCORE(WS-IDX) というアクセスの形は同じです。