COBOLにおけるテーブル(配列)の添字と繰り返し処理の基礎知識
こんにちは。ゆうせいです。
新人エンジニアの皆様にとって、プログラミング言語ごとの仕様の違いを把握することは、バグを未然に防ぐための重要なステップです。今回は、事務処理計算で広く活用されているCOBOLにおけるテーブル(配列)の構造と、その参照方法について解説します。
COBOLにおけるテーブルの概念と定義
COBOLでは、他の言語で配列と呼ばれるデータの集まりをテーブルと呼びます。テーブルを定義する際は、同じデータ項目が何回繰り返されるかを指定するOCCURS句を使用します。
テーブルの定義方法
テーブルはデータ部の作業場所節(WORKING-STORAGE SECTION)などで次のように定義します。
01 SALES-TABLE.
03 MONTHLY-REVENUE PIC 9(7) OCCURS 12 TIMES.
この定義では、7桁の数字項目であるMONTHLY-REVENUEが12個分、連続したメモリ領域に確保されます。
添字の開始番号とその性質
COBOLの最大の特徴の一つは、テーブルの要素を指し示す番号(添字)が1から始まることです。これを1オリジンと呼びます。
1オリジンの考え方
JavaやPythonなどの主要な言語では、最初の要素を0番目として数えますが、COBOLは人間の直感的な数え方に合わせて1番目からカウントします。
- 最初の要素:MONTHLY-REVENUE(1)
- 最後の要素:MONTHLY-REVENUE(12)
これをビルに例えると、Javaなどは1階を「地上から0階分上がった場所」と捉えて0階(Ground Floor)と呼びますが、COBOLはそのまま1階と呼ぶ形式です。高校数学の数列において、第1項を と記述する感覚に近いといえます。
添字の種類:サブスクリプトとインデックス
COBOLでテーブルの特定の要素を参照する方法には、サブスクリプトとインデックスの2種類があります。
サブスクリプト(Subscript)
データ部で定義した通常の変数(PIC 9形式など)を添字として使用する方法です。
- メリット:他の計算処理で使用している変数をそのまま流用できるため、汎用性が高いです。
- デメリット:実行時にシステムが「メモリ上の位置」を計算し直す必要があるため、処理速度はインデックスに劣ります。
インデックス(Index)
テーブル定義時にINDEXED BY句を用いて指定する、専用の参照変数です。
- メリット:コンパイル時にメモリ上の相対位置(オフセット)として扱われるよう最適化されるため、大量のデータを処理する際の実行速度が非常に高速です。
- デメリット:テーブル専用の変数であるため、通常の算術演算(COMPUTE文など)で直接計算することができず、SET文を用いて値を操作する必要があります。
繰り返し処理(PERFORM文)との組み合わせ
テーブルの全要素を処理する場合、PERFORM VARYING文を使用します。
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 12
DISPLAY MONTHLY-REVENUE(I)
END-PERFORM.
この構文では、変数Iを1から開始し、1ずつ加算しながら12を超えるまで処理を繰り返します。開始値を0に設定したり、終了条件を「I = 12」に設定して11回で終わらせてしまったりしないよう、論理的な境界値の確認が不可欠です。
境界超過に関する注意点
COBOLでは、定義した範囲外の添字(例:12個の要素に対して13番目)を参照しようとした場合、実行環境の設定によってはエラーにならず、隣接する別のメモリ領域を読み書きしてしまうことがあります。
- メリット:実行時のチェックを省くことで、処理のオーバーヘッドを最小限に抑えられます。
- デメリット:プログラムが異常終了せずに誤った計算結果を出し続ける「静かなバグ」の原因となり、原因特定が困難になります。
開発時には、コンパイラのオプションで境界チェック機能を有効にするなどの対策が推奨されます。
学習のステップ
COBOLのテーブル操作を習得するためには、以下の段階を踏んで理解を深めることが効果的です。
- OCCURS句を用いた単一テーブルの定義と、1から始まる添字による基本操作を練習する。
- PERFORM VARYING文を用い、ループ変数(添字)の推移をデバッグ等で確認する。
- 処理速度が求められる場面を想定し、INDEXED BY句とSET文によるインデックス操作を実装する。
- 多次元テーブル(OCCURS句の入れ子)へと応用し、複雑なデータ構造の管理方法を学ぶ。
セイ・コンサルティング・グループでは新人エンジニア研修のアシスタント講師を募集しています。
投稿者プロフィール


