1. 導入:なぜ「USING句」が重要なのか?
COBOLの開発現場では、一つの巨大なプログラムですべてを完結させることは稀です。機能ごとに小さなプログラム(サブプログラム)を分割し、それらを「CALL」命令で呼び出すのが一般的です。その際、メインプログラムからサブプログラムへデータを渡すために不可欠なのが「USING句」です。これを使えるようになると、プログラムの部品化が進み、保守性が飛躍的に向上します。データの受け渡しに失敗するとプログラムは異常終了してしまうため、正しい書き方をしっかりと押さえておきましょう。
2. 基礎知識:引数受け渡しの仕組み
COBOLにおける「引数(ひきすう)」の受け渡しは、値そのものをコピーするのではなく、変数の「メモリ上の住所(アドレス)」を渡す仕組みになっています。
メイン側で定義した変数の並び順と、サブ側で受け取る変数の並び順・型・サイズが完全に一致している必要があります。もし、メイン側で「数字」を渡しているのに、サブ側で「文字列」として受け取ってしまうと、メモリの読み込みミスが発生し、思わぬバグや異常終了の原因となります。
3. 実装/解決策:正しい連携の手順
以下の手順で実装を行います。
1. 呼び出し元(CALL側):CALL命令の後にUSING句を書き、渡したい変数を並べる。
2. 呼び出し先(サブプログラム側):PROCEDURE DIVISIONの後にUSING句を書き、受け取る変数を並べる。
3. 呼び出し先(LINKAGE SECTION):受け取る変数の定義を記述する。
4. サンプルプログラム
以下は、メインから数値を渡し、サブで計算結果を返すシンプルな例です。
【呼び出し元(MAIN.cbl)】
IDENTIFICATION DIVISION.
PROGRAM-ID. MAIN.
WORKING-STORAGE SECTION.
01 WS-VAL1 PIC 9(3) VALUE 10.
01 WS-VAL2 PIC 9(3) VALUE 20.
PROCEDURE DIVISION.
> サブプログラムを呼び出し、2つの変数を渡す
CALL “SUB-CALC” USING WS-VAL1, WS-VAL2.
DISPLAY “計算完了。結果はメイン側でも参照可能です。”
STOP RUN.
【呼び出し先(SUB-CALC.cbl)】
IDENTIFICATION DIVISION.
PROGRAM-ID. SUB-CALC.
LINKAGE SECTION.
> メイン側のデータを受け取るための領域
01 LN-VAL1 PIC 9(3).
01 LN-VAL2 PIC 9(3).
PROCEDURE DIVISION USING LN-VAL1, LN-VAL2.
> 受け取ったLN-VAL2に加算する
ADD 5 TO LN-VAL2.
DISPLAY “サブ側で加算処理を実施しました。”
EXIT PROGRAM.
5. 応用・注意点:現場で陥りやすい罠
現場で最も多いトラブルは「データ型の不一致」です。特に、メイン側で「PIC 9(5)」としているのに、サブ側で「PIC 9(3)」のようにサイズを小さく定義してしまうと、隣接するメモリ領域を破壊してしまう恐れがあります。
また、BY CONTENTを指定すると値そのものを渡す(変更しても元には影響しない)、BY REFERENCE(デフォルト)を指定するとアドレスを渡す(変更すると元の値も変わる)という違いがあります。現場の規約に合わせて使い分けましょう。最初は、メインとサブでLINKAGE SECTIONの定義をコピー&ペーストして、型とサイズを完全に揃える習慣をつけることが、バグを未然に防ぐコツですよ。

コメント