SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

COBOLプログラミング

OpenCOBOLと他言語の連携

C言語で作成したモジュールとの連携方法

  • X ポスト
  • このエントリーをはてなブックマークに追加

プログラム連携の実際 その1

 メイン処理をOpenCOBOLで作成し、連携先プログラムをCで作成した場合のプログラム連携の機能について確認します。

サンプルプログラムの内容

 メイン処理プログラムでメイン処理開始の表示を行います。メイン処理プログラムの中に連携先プログラムで使用するデータを設定し、連携先プログラムにおいて表示および更新を行います。連携先プログラムの処理終了後に、メイン処理で連携先プログラムで更新されたデータとメイン処理終了の表示を行います。

メイン処理プログラムの内容

 メイン処理のプログラムではMAIN PROD(COBOL)を表示し、連携先プログラムで表示する内容を設定します。連携先プログラムの実行終了後に、連携先プログラムで更新された内容を表示します。なお、プログラムの開始時と終了時にそれぞれMAIN-STARTMAIN-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. 1~4桁の場合
    (例) PIC 9(3) COMP-5.
    short型 (2バイト)
  2. 5~9桁の場合
    (例) PIC 9(6) COMP-5.
    int型 (4バイト)
  3. 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;
}

 プログラムソースの内容を簡単に説明します。

  1. #include <stdio.h>
    printf関数を使用するために必要なプロトタイプ等を含める宣言です。
  2. typedef struct { ~ linkage_section;
    メイン処理で定義されているインターフェイスの内容を構造体で定義しています。
  3. int csubc(linkage_section *sub_snd) {
    連携先プログラムの関数の入り口を定義しています。メイン処理プログラムのCALL文で指定される連携先プログラム名と合わせる必要があります。メイン処理で定義されているOpenCOBOLからはインターフェイスの先頭アドレスが渡されますので、前項で説明したインターフェイス構造体をポインタで指定しています。
  4. printf
    準出力にデータ等を出力する関数です。当プログラムには3箇所コーディングされています。
  5. sub_snd->cnt--
    メイン処理で定義されたCNTを当プログラムで1減じて更新しています。
単体項目でのインターフェイス

 本稿では、数値型と文字型の複合インターフェイスの例を紹介していますが、単体項目での指定方法は次のようになります。

インターフェイス単体OpenCOBOL側のソース例
001800 CALL "cobsubc" USING CNT MSG.
インターフェイス単体C側のソース例
#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@]$

 意図した内容で表示される事が確認できます。

次のページ
プログラム連携の実際 その2

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
COBOLプログラミング連載記事一覧

もっと読む

この記事の著者

布施 榮一(ふせえいいち)

布施加工有限会社 代表取締役布施加工って何しているとこなの??実はIT屋さんだったりします(笑)Linux基盤各種サービスの設計構築およびコンサルティングをやっています。ブログもちょこちょこっと書いてます。Alinous-Core 正規販売代理店

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2951 2008/09/29 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング