処理パターン(4) 外部サブプログラム呼ぶ
macOS 10.15.7 / cobc 3.2.0
「処理パターン(3) テーブルの利用」をメインプログラムとサブプログラムの二つに分割する。サブプログラムでは、前処理で行っていた顧客マスターファイルの読み込みとテーブル展開を行う。メインプトグラムは前処理でサブプログラムを呼び出し、戻り値として顧客マスターテーブルを受け取る。(分割する意味はあまりなさそうだが、サブプログラムの説明の一例として挙げてみる。)
入出力構成図
![[cob05_01.png]](cob05_01.png)
インタフェースの実装方法
COBOLでは、ソースファイルがコンパイル単位となり、そこから一つの実行ファイルが作成される。サブプログラムもこの一種である。プログラムを呼び出すには PROGRAM-IDを指定して CALL文を実行する。
引数と戻り値
メインプログラムとサブプログラムのデータの受け渡しは、メインプログラムでデータを格納するメモリ領域を確保し、その参照(アドレス)をサブプログラムに渡すという方法をとる。メイン側でデータをセットすればプログラムの引数に、サブ側でセットすれば戻り値になるわけである。
メインプログラム
WORKING-STORAGE SECTIONにサブプログラムに引き渡す変数を定義し、サブプログラムを呼び出す CALL文の USING句に指定する。デフォルトでは変数の受け渡しは参照渡し(BY REFERENCE)となる。(BY CONTENTを指定すれば変数を値渡しにすることができる)
サブプログラムで RERURN-CODE変数(予約語、グローバル変数の一種)に値をセットすると、メインプログラムの CALL文 GIVING句に指定した変数に値が渡る。狭義にはこれが戻り値であるが、数値しか扱えないので、一般的にはコンディションコードとして利用する。
顧客マスターの検索処理
メインプログラムに展開されている顧客マスターテーブルを検索する。このコードは 「処理パターン(3) テーブルの利用 と全く同じである。
ソースコード MAIN01.cbl
サブプログラム
LINKAGE SECTIONに、呼び出し元との間で受け渡すデータの領域を定義する。これは、メインプログラムの CALL文の USING句に指定したインタフェース領域と等しくなくてはいけない。
PROCEDURE DIVISIONには、LINKAGE SECTIONに定義した変数を USING句で指定する。処理終了後は、GOBACK文により制御を呼び出し元に返す。
サブプログラム本体(MAIN-RTN)
顧客マスターファイルを読み込み、LINKAGE SECTIONに定義したテーブルにデータを展開する。このテーブルは実際はメインプログラムの領域にあるので、制御がメインプログラムに戻った後、メインプログラムで利用することができる。
なお、COBOLでは言語仕様上、メモリのテーブルは予め固定長の領域を割り当てる必要がある。顧客マスターファイルのレコード件数がテーブルに割り当てられた件数を超える場合はエラーとして、RETURN-CODEにエラーコード(100)を設定してメインに戻る。
ソースコード SUB01.cbl
コンパイル・リンクの方法
静的リンク
一括してコンパイルする。
サブプログラムを別にコンパイルする。
動的(ダイナミック)リンク
共用オブジェクトを特定のフォルダにおく
GnuCOBOLのコンパイルの詳細についてはこちらを参照