導入: なぜCALL文が重要なのか
COBOL開発において、一つのソースコードに何万行ものロジックを詰め込むのは「バグの温床」です。プログラムを機能単位で分割し、必要な時に呼び出す「モジュール化」は、保守性と再利用性を高めるための必須スキルです。その心臓部となるのが CALL文 です。これを使うことで、複雑な処理を疎結合に保ち、チーム開発を円滑に進めることが可能になります。
基礎知識: CALL文と制御の仕組み
CALL文は、現在のプログラム(呼び出し元)から別のプログラム(呼び出される側)へ制御を移す命令です。特徴的なのは、呼び出されたプログラムが終了すると、自動的に「呼び出し元のCALL文の次の行」へ戻ってくる点です。
ここで重要なのが USING句 です。これを使うことで、呼び出し元と呼び出し先のプログラム間でデータを共有(受け渡し)できます。メモリ上のアドレスを渡すイメージで、引数として指定した領域を共有します。
実装/解決策: 正しいデータ連携の手順
CALL文を使いこなすには、呼び出し元と呼び出し先で データ定義(PICTURE句など)を完全に一致させる ことが鉄則です。ここが不一致だと、予期せぬメモリ破壊や異常終了の原因となります。
また、呼び出し先では LINKAGE SECTION に受け取る引数を定義し、 PROCEDURE DIVISION USING にその名前を記述する必要があります。
サンプルプログラム
以下は、メインプログラムからサブプログラムを呼び出し、計算結果を受け取るシンプルな例です。
[メインプログラム: MAINPROG.cbl]
IDENTIFICATION DIVISION.
PROGRAM-ID. MAINPROG.
WORKING-STORAGE SECTION.
01 WS-VAL1 PIC 9(05) VALUE 100.
01 WS-VAL2 PIC 9(05) VALUE 200.
01 WS-RESULT PIC 9(05).
PROCEDURE DIVISION.
> サブプログラムを呼び出し、引数を渡す
CALL “SUBPROG” USING WS-VAL1, WS-VAL2, WS-RESULT.
DISPLAY “計算結果: ” WS-RESULT.
STOP RUN.
[サブプログラム: SUBPROG.cbl]
IDENTIFICATION DIVISION.
PROGRAM-ID. SUBPROG.
LINKAGE SECTION.
01 LK-VAL1 PIC 9(05).
01 LK-VAL2 PIC 9(05).
01 LK-RESULT PIC 9(05).
PROCEDURE DIVISION USING LK-VAL1, LK-VAL2, LK-RESULT.
> 受け取った値を加算して結果を返す
COMPUTE LK-RESULT = LK-VAL1 + LK-VAL2.
GOBACK.
応用・注意点: 現場で役立つアドバイス
1. GOBACK vs EXIT PROGRAM: サブプログラムの終了には GOBACK を推奨します。これはプログラムのコンパイルオプション(動的/静的呼び出し)に依存せず、常に適切な復帰処理を行ってくれるためです。
2. 動的呼び出しの罠: CALL文で「定数(文字列)」ではなく「一意名(変数)」を指定すると、実行時にプログラムを動的にロードできます。これは柔軟性が高い反面、存在しないプログラムを呼び出すと即座に異常終了するため、 ON EXCEPTION 句でのエラーハンドリングを忘れないようにしましょう。
3. データ型の一致: 現場で最も多いミスは「片方がPIC X(10)で、もう片方がPIC X(08)」といった桁数の不一致です。COPY句を使用して、引数の定義を共通化するのがプロの現場のスタンダードです。

コメント