プログラム連携の実際 その1
メイン処理をOpenCOBOLで作成し、連携先プログラムをCで作成した場合のプログラム連携の機能について確認します。
サンプルプログラムの内容
メイン処理プログラムでメイン処理開始の表示を行います。メイン処理プログラムの中に連携先プログラムで使用するデータを設定し、連携先プログラムにおいて表示および更新を行います。連携先プログラムの処理終了後に、メイン処理で連携先プログラムで更新されたデータとメイン処理終了の表示を行います。
メイン処理プログラムの内容
メイン処理のプログラムではMAIN PROD(COBOL)
を表示し、連携先プログラムで表示する内容を設定します。連携先プログラムの実行終了後に、連携先プログラムで更新された内容を表示します。なお、プログラムの開始時と終了時にそれぞれMAIN-START
、MAIN-STOP
をあわせて表示します。
ソースの内容は次のとおりです。
000100*COPYRIGHT FUSEKAKO 000200 IDENTIFICATION DIVISION. 000300 PROGRAM-ID. cmaincob. 000400 ENVIRONMENT DIVISION. 000500 DATA DIVISION. 000600 WORKING-STORAGE SECTION. 000700 01 SUB-SND. 000800 03 CNT PIC 9(5) COMP-5. 000900 03 MSG PIC X(20). 001000 PROCEDURE DIVISION. 001100 DISPLAY "MAIN-START". 001200 DISPLAY "MAIN PROD(COBOL)". 001300 MOVE 10 TO CNT. 001400 MOVE "SUB PROD(C)" TO MSG. 001500 CALL "csubc" USING SUB-SND. 001600 DISPLAY CNT. 001700 DISPLAY "MAIN-STOP". 001800 STOP RUN.
前回は、OpenCOBOL相互でのデータ引き渡しだったで、メイン処理プログラムと連携先プログラムで同じデータ項目を指定すればよかったのですが、連携先プログラムがC言語であるため、順序番号000800で定義されている数値項目をCOMP-5
と指定し、C言語で数値項目をそのまま使用できるようにしています。
本稿はC言語で使用する数値項目をint型としていますが、メイン処理の桁数によりshort型、long型にすることもできます。PICTURE句で指定した桁数によって、次のように決まります。
- 1~4桁の場合
(例) PIC 9(3) COMP-5.
short型 (2バイト) - 5~9桁の場合
(例) PIC 9(6) COMP-5.
int型 (4バイト) - 10~18桁の場合
(例) PIC 9(11) COMP-5.
long型 (8バイト)
連携先プログラムの内容
連携先プログラムでは、メイン処理プログラムで設定した値であるSUB PROD(C)
と数値を表示させるようにします。数値のみ1減算し、プログラムを終了します。 ソースの内容は次のとおりです。
#include <stdio.h> typedef struct { int cnt; char msg[20]; } linkage_section; int csubc(linkage_section *sub_snd) { printf("SUB-START\n"); printf("%s%d\n",sub_snd->msg,sub_snd->cnt); sub_snd->cnt--; printf("SUB-END\n"); return 0; }
プログラムソースの内容を簡単に説明します。
- #include <stdio.h>
printf関数を使用するために必要なプロトタイプ等を含める宣言です。 - typedef struct { ~ linkage_section;
メイン処理で定義されているインターフェイスの内容を構造体で定義しています。 - int csubc(linkage_section *sub_snd) {
連携先プログラムの関数の入り口を定義しています。メイン処理プログラムのCALL文で指定される連携先プログラム名と合わせる必要があります。メイン処理で定義されているOpenCOBOLからはインターフェイスの先頭アドレスが渡されますので、前項で説明したインターフェイス構造体をポインタで指定しています。 - printf
準出力にデータ等を出力する関数です。当プログラムには3箇所コーディングされています。 - sub_snd->cnt--
メイン処理で定義されたCNTを当プログラムで1減じて更新しています。
本稿では、数値型と文字型の複合インターフェイスの例を紹介していますが、単体項目での指定方法は次のようになります。
001800 CALL "cobsubc" USING CNT MSG.
#include <stdio.h> int cobsubc(int *cnt, char **msg) { printf("SUB-START\n"); printf("%s%d\n",msg,cnt); cnt--; printf("SUB-END\n"); return 0; }
サンプルプログラムのコンパイル
今回もサンプルコードを用意したので、必要に応じて利用してください。サンプルコードを適当なディレクトリ、ファイルに格納し、前述したコンパイルコマンドでメイン処理プログラムと連携先プログラムをコンパイルします。
以下は、メイン処理プログラム名を「cmaincob.cob」、連携先プログラム名を「csubc.c」とした例です。
/usr/local/bin/cobc -x -o cmaincobexe cmaincob.cob csubcob.c
/usr/local/bin/cobc -c -x -o cmaincob.o cmaincob.cob /usr/local/bin/cobc -c -o -o csubc.o csubc.c /usr/local/bin/cobc -x -o cmaincobbin cmaincob.o csubc.o
コンパイルに問題が無ければ、直接実行型ファイルを作成するコンパイル例では「cmaincobexe」が、分割コンパイルによる実行型ファイルを作成するコンパイル例では、それぞれ「cmaincob.o」「csubc.o」「cmaincobbin」が作成されます。
サンプルプログラムの実行
前項で作成した実行型ファイルを実行します。実行例は次のとおりです。
[e-fuse@]$ ./cmaincobexe MAIN-START MAIN PROD(COBOL) SUB-START SUB PROD(COBOL) 10 SUB-END 09 MAIN-STOP [e-fuse@]$
意図した内容で表示される事が確認できます。