C と COBOL プログラム間のデータの受け渡し

レコード レイアウトを使用したデータの渡し方について説明します。

COBOL のレコードの構造は、文字列配列を含む C の構造体に似ています。COBOL コンパイラがレコードを割り当てるときには、特定のハードウェア プラットフォーム向けに 2 進項目やポインター データ項目が整列されたり、 2 進 (COMP-X) データ項目のバイト オーダーが調整されたりすることはありません。その結果、COBOL アプリケーションは、異なるプラットフォーム間で優れた互換性を発揮します。ただし、複数の言語を使用する開発環境では、この互換性が問題の原因になる可能性もあります。C の構造体は COBOL のレコードに比べ定義が緩やかであり、オペレーティング システムによって構造が大きく異なります。たとえば、COBOL では次のように、構造体がどのプラットフォームでコンパイルされていても構造体の長さは 6 バイトです。

01  mystruct is typedef.
	    05  mystruct-key-1     pic x occurs 2.
	    05  mystruct-bin-1     pic x(4) comp-5.

ところが、このレコードを単純に書き直しただけでも、C の構造体は異なる結果になります。たとえば、次の例では通常、32 ビット オペレーティング システムでは 8 バイト、64 ビット オペレーティング システムでは 16 バイトのサイズの構造体になります。整列によるパディングが施されるためです。

struct mystruct
 {
	     char		mystruct_key_1[2];
	     long		mystruct_bin_1;
	 };

互換性があるため、より良い解決策は、次のように C 構造を使用して COBOL レコード mystruct を表現することです。

struct mystruct
 {
	     char		mystruct_key_1[2];
	     char		mystruct_bin_1[4];
	 };

混合言語アプリケーション用に COBOL データ レコードを C データ型に変換できるように、C インクルード ファイルが用意されています。このファイル cbltypes.h は、%ProgramFiles(x86)%\Micro Focus\Enterprise Developer\include(Windows) または $COBDIR/include(UNIX) にあります。これには、COBOL アプリケーションおよび CBL_ ライブラリ ルーチンのインターフェイスで使用される基本的なデータ型の多くが含まれています。これらの型は、デフォルトで %ProgramFiles(x86)%\Micro Focus\Enterprise Developer\cpylib (Windows) または $COBDIR/cpylib(UNIX) にあるコピーブック cbltypes.cpy に含まれている型に直接対応しています。

上記の例で、次の COBOL レコード配置は、

01  mystruct is typedef.
     05  mystruct-key-1  cblt_x1 occurs 2. *> aka. "PIC X"
     05  mystruct-bin-1  cblt_x4_comp5.    *> aka. 
#                                       "PIC X(4) COMP-5"

cbltypes.h を使用して、次のように C で正しく表すことができます。

#include "cbltypes.h"

	struct mystruct 
 {
		cbl_x1_t          mystruct_key_1[2];
		cbl_x4_comp5_t    mystruct_bin_1;
	};

cbltypes.h で使用される型名変換は、対応する COBOL 型定義の PICTURE 文字列を反映したものです。同ファイル内で定義されている基本的なデータ型を次に示します。

cbl_x1_t  cobol character position - basis for all types
  
cbl_pointer_t   Equivalent to: USAGE POINTER
cbl_ppointer_t  Equivalent to: USAGE PROCEDURE-POINTER
  
cbl_sx1_comp5_t Equivalent to: PIC s9(n) COMP-5 
                                         where n=1 or 2
cbl_sx2_comp5_t Equivalent to: PIC s9(n) COMP-5 
                                         where n=3 or 4
cbl_sx4_comp5_t Equivalent to: PIC s9(n) COMP-5 
                                         where n=7 through 9
cbl_sx8_comp5_t Equivalent to: PIC s9(18) COMP-5
  
cbl_x1_comp5_t  Equivalent to: PIC X(1) COMP-5
cbl_x2_comp5_t  Equivalent to: PIC X(2) COMP-5
cbl_x4_comp5_t  Equivalent to: PIC X(4) COMP-5
cbl_x8_comp5_t  Equivalent to: PIC X(8) COMP-5
  
cbl_x1_compx_t  Equivalent to: PIC X(1) COMP-X
cbl_x2_compx_t  Equivalent to: PIC X(2) COMP-X
cbl_x4_compx_t  Equivalent to: PIC X(4) COMP-X
cbl_x8_compx_t  Equivalent to: PIC X(8) COMP-X

COBOL のデータ型に相当する型を使用すれば、COBOL 側とのデータの互換性は維持できます。ただし、これらのデータは C のコード内で処理する必要があります。これを可能にするために、C ライブラリ ルーチンが提供されています。これらのルーチンを使用すると、多くの COBOL ベースのデータ型を C アプリケーション コンポーネントのコンテキストでの使用に適した形式に変換できます。