【COBOL学習|豆知識】COBOLの計算処理を安全に!COMPUTE文の範囲を正しく制御しよう

導入

COBOL開発において、複雑な計算を行う際に欠かせないのがCOMPUTE文です。しかし、複数の計算や条件分岐が重なる中で、どこからどこまでが「計算処理」なのか、あるいは「エラー処理」の対象なのかを明確にするのは重要です。特に、桁あふれ(ON SIZE ERROR)発生時の挙動を制御する際、構造化構文であるEND-COMPUTEを活用することで、意図しないバグを未然に防ぎ、可読性の高いコードを書くことができます。

基礎知識

COMPUTE文は、算術演算子(+、-、、/、)を使用して複雑な数式を一行で記述できる強力な命令です。ここに「ON SIZE ERROR」句を追加すると、計算結果がターゲットのデータ項目の桁数を超えた場合に、特定のアクション(エラー処理)を実行させることができます。
以前の古いCOBOL規格では、ピリオド(.)で文を終了させていましたが、これだとプログラムの構造が複雑になった際に、どこでエラー処理が終わるのかが曖昧になりがちでした。そこで導入されたのが「END-COMPUTE」です。これにより、計算の範囲を明確に区切ることが可能となりました。

実装/解決策

END-COMPUTEを用いる最大のメリットは、計算処理の「スコープ(有効範囲)」を明確にできることです。これにより、IF文や他の制御構文の中に入れ子(ネスト)として計算処理を配置しても、エラー処理の対象範囲が正しく解釈されます。特に、計算結果がゼロ除算や桁あふれを起こした際に、その後のプログラム処理を誤って中断・継続することを防ぎます。

サンプルプログラム

以下に、END-COMPUTEを使用した安全な計算処理のサンプルコードを提示します。

IDENTIFICATION DIVISION.
PROGRAM-ID. COMPUTE-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 VAL-A PIC 9(3) VALUE 100.
01 VAL-B PIC 9(1) VALUE 0.
01 RESULT PIC 9(3).
01 ERROR-FLAG PIC X VALUE ‘N’.

PROCEDURE DIVISION.
> 除算の計算処理
COMPUTE RESULT = VAL-A / VAL-B
ON SIZE ERROR
> 計算範囲内でエラーが発生した場合の処理
MOVE ‘Y’ TO ERROR-FLAG
DISPLAY ‘エラー: ゼロ除算または桁あふれが発生しました。’
NOT ON SIZE ERROR
> 正常終了時の処理
MOVE ‘N’ TO ERROR-FLAG
DISPLAY ‘計算成功: 結果は ‘ RESULT
END-COMPUTE.

> ここ以降はCOMPUTEの範囲外として安全に処理が継続される
IF ERROR-FLAG = ‘Y’
DISPLAY ‘異常系処理を実行します。’
END-IF.

STOP RUN.

応用・注意点

現場での注意点として、ピリオド(.)の位置には細心の注意を払ってください。END-COMPUTEを使用している箇所で、COMPUTE文の直後にピリオドを置いてしまうと、そこで文が強制終了してしまい、意図しない制御フローになることがあります。
また、複数の計算を一行で書くのは便利ですが、処理が複雑すぎるとデバッグが困難になります。可読性を保つためにも、計算式は適度に分割し、必ずEND-COMPUTEで明示的に範囲を閉じる癖をつけることが、保守性の高いプログラムを作るベテランの作法です。

コメント

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