プログラム連携の実際 その2
メイン処理をCで作成し、連携先プログラムをOpenCOBOLで作成した場合のプログラム連携の機能について確認します。
サンプルプログラムの内容
「プログラム連携の実際 その1」と処理内容は同じです。
メイン処理プログラムの内容
「プログラム連携の実際 その1」のメイン処理同様、メイン処理のプログラムではMAIN PROD(C)
を表示し、連携先プログラムで表示する内容を設定します。連携先プログラムの実行終了後に、連携先プログラムで更新された内 容を表示します。なお、プログラムの開始時と終了時にそれぞれMAIN-START
、MAIN-STOP
をあわせて表示します。
ソースの内容は次のとおりです。
#include <stdio.h> #include <libcob.h> typedef struct { int cnt; char msg[20]; } linkage_section; extern int csubcob(linkage_section *sub_snd); int main(int argc,char **argv) { linkage_section sub_snd = {10,"SUB PROD(COBOL)"}; cob_init (0,NULL); printf("MAIN-START\nMAIN PROD(C)\n"); csubcob(&sub_snd); printf("MAIN-END\n"); }
連携先プログラムがOpenCOBOLであり、OpenCOBOLライブラリを使用するため、プロトタイプ宣言取り込みと初期処理関数を使用しています。
また、連携先プログラムを外部関数として定義しています。
連携先プログラムの内容
連携先プログラムでは、メイン処理プログラムで設定した値であるSUB PROD(COBOL)
と数値を表示させるようにします。数値のみ1減算しプログラムを終了します。
ソースの内容は次のとおりです。
000100*COPYRIGHT FUSEKAKO 000200 IDENTIFICATION DIVISION. 000300 PROGRAM-ID. csubcob. 000400 ENVIRONMENT DIVISION. 000500 DATA DIVISION. 000600 LINKAGE SECTION. 000700 01 SUB-REC. 000800 03 CNT PIC 9(5) COMP-5. 000900 03 MSG PIC X(20). 001000 PROCEDURE DIVISION USING SUB-REC. 001100 DISPLAY "SUB-START " 001200 DISPLAY MSG WITH NO ADVANCING. 001300 DISPLAY CNT. 001400 SUBTRACT 1 FROM CNT. 001500 DISPLAY "SUB-END". 001600 EXIT PROGRAM.
メイン処理で定義したint型数値項目を使用するために数値項目の定義がCOMP-5
になっている点を除き、前回の記事で説明した連携先プログラムと同じ内容になっています。
順序番号000300のPROGRAM-IDは、メイン処理で外部関数定義した名称と同じにします。
サンプルプログラムのコンパイル
コンパイル方法は「プログラム連携の実際 その1」で説明した内容と同様です。以下は、メイン処理プログラム名を「cmainc.c」、連携先プログラム名を「csubcob.cob」とした例です。
/usr/local/bin/cobc -x -o cmaincexe cmainc.c csubcob.cob
/usr/local/bin/cobc -c -x -o cmainc.o cmainc.c /usr/local/bin/cobc -c -o -o csubcob.o csubcob.cob /usr/local/bin/cobc -x -o cmaincbin cmainc.o csubcob.o
コンパイルに問題が無ければ、直接実行型ファイルを作成するコンパイル例では「cmaincexe」が、分割コンパイルによる実行型ファイルを作成するコンパイル例では、それぞれ「cmainc.o」「csubcob.o」「cmaincbin」が作成されます。
サンプルプログラムの実行
前項で作成した実行型ファイルを実行します。実行例は次のとおりです。
[e-fuse@]$ ./cmaincexe MAIN-START MAIN PROD(C) SUB-START SUB PROD(COBOL)00010 SUB-END 9 MAIN-STOP [e-fuse@]$
意図した内容で表示される事が確認できます。
まとめ
今回は連携する言語としてCを選定しましたが、オブジェクト出力可能なコンパイラが用意されている言語であれば、同様に連携することができます。OpenCOBOLによる開発も十分使用に耐えることが、ご理解いただけたかと思います。
次回は、OpenCOBOLとPostgreSQLの連携について稿を進めたいと思います。
参考
- OpenCOBOL Manual:OpenCOBOL
- COBOLプログラミング 基本編 :CodeZine(基本的なCOBOL言語の解説)