【COBOL学習|豆知識】ベテランが教える「PERFORM VARYING」の落とし穴 ― 増分値 0 が招く無限ループの恐怖

導入: なぜこの注意が必要なのか

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を指定すると無限ループになるため注意!
PERFORM VARYING WS-IDX FROM 1 BY 1 UNTIL WS-IDX > 5 DISPLAY "現在のカウント値: " WS-IDX END-PERFORM. STOP RUN.

応用・注意点: 現場で役立つ回避策

現場で「増分が動的に変化する」ロジックを書く際は特に注意が必要です。計算結果が0になるような変数をBY句に渡すと、コンパイル時には検知できず、本番環境の実行時に初めて無限ループが発生するという最悪の事態になりかねません。

回避策としてのアドバイス:
1. 固定値を使う:可能な限りBY句には定数(BY 1など)を使用しましょう。
2. 事前検証:変数で増分を制御せざるを得ない場合は、PERFORMに入る直前に「IF 増分値 = 0 THEN エラー処理」といったチェックルーチンを設けるのが、ベテランの守り方です。

「動かないプログラム」をデバッグするのは、現場で最も骨の折れる作業の一つです。基本を疎かにせず、安全なコードを心がけましょう。

コメント

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