導入: なぜこの注意が必要なのか
COBOLプログラミングにおいて、繰り返し処理を制御する「PERFORM VARYING」文は非常に強力な武器です。しかし、この構文の「BY句」に指定する値に誤りがあると、プログラムは瞬く間に停止不能な「無限ループ」に陥ります。特に「増分値(BY句の値)に0を指定する」というミスは、プログラムの論理設計として致命的です。本稿では、この危険性と、正しく繰り返しを制御するための基礎知識を解説します。
基礎知識: PERFORM VARYING の仕組み
PERFORM VARYING は、指定したデータ項目(指標やカウンタ)を初期値から終了値まで、一定の増分で変化させながら処理を繰り返す構文です。
基本的な構造は以下の通りです。
1. 初期化:開始値を設定する。
2. 条件判定:終了条件を満たしているかチェックする。
3. 実行:処理内容を実行する。
4. 増分:BY句で指定した値を加算(または減算)する。
この「4. 増分」のステップで0を指定してしまうと、カウンタの値が永久に変わらないため、終了条件の判定が常に偽となり、プログラムが一生その場から動けなくなってしまうのです。
実装/解決策: 正しいステップ幅の設定
増分値には、必ず「1以上の正の整数」または「-1以下の負の整数」を指定してください。もし、条件によって増分を0にしたいというロジックが必要な場合は、PERFORM文の設計自体を見直す必要があります。その場合は、IF文を用いた条件分岐や、PERFORM UNTILによる制御へ切り替えるべきです。
サンプルプログラム: 安全なループ処理
以下に、基本的な増分処理の例を示します。0を指定してはいけないという教訓を込めて、正しい1ずつのカウントアップを実装します。
IDENTIFICATION DIVISION.
PROGRAM-ID. LOOP-SAMPLE.
WORKING-STORAGE SECTION.
01 WS-IDX PIC 9(02) VALUE 0.
PROCEDURE DIVISION.
MAIN-PROCEDURE.
- 1から5まで、1ずつ増分させて処理を繰り返す
- BY句に0を指定すると無限ループになるため注意!
応用・注意点: 現場で役立つ回避策
現場で「増分が動的に変化する」ロジックを書く際は特に注意が必要です。計算結果が0になるような変数をBY句に渡すと、コンパイル時には検知できず、本番環境の実行時に初めて無限ループが発生するという最悪の事態になりかねません。
回避策としてのアドバイス:
1. 固定値を使う:可能な限りBY句には定数(BY 1など)を使用しましょう。
2. 事前検証:変数で増分を制御せざるを得ない場合は、PERFORMに入る直前に「IF 増分値 = 0 THEN エラー処理」といったチェックルーチンを設けるのが、ベテランの守り方です。
「動かないプログラム」をデバッグするのは、現場で最も骨の折れる作業の一つです。基本を疎かにせず、安全なコードを心がけましょう。

コメント