Passing data using record layouts.
COBOL レコード配置は、文字配列を含む C 構造と似ています。 コンパイラが COBOL レコード配置を割り当てる場合、特定のハードウェアで必要とされるバイナリやポインタデータ項目の整列、バイナリ (COMP-X) データ項目のバイト順を考慮しません。このため COBOL アプリケーションは非常に移植可能なものです。 しかし、この移植性は、混在言語のアプリケーションで問題を発生します。 C 構造の配置は、COBOL レコード配置では厳密に定義できないし、オペレーティングシステム毎に変わります。 たとえば、COBOL で、次の構造は、
01 mystruct is typedef. 05 mystruct-key-1 pic x occurs 2. 05 mystruct-bin-1 pic x(4) comp-5.
は、どのプラットフォームでコンパイルしても、6 バイト長です。 しかし、多くのオペレーティングシステムで提供されている C コンパイラでは、C でのレコード配置の表現は、異なる結果をもたらします。たとえば、
struct mystruct
{
char mystruct_key_1[2];
long mystruct_bin_1;
};
これは、データの整列とパディングのために、32 ビットのオペレーティングシステムでは 8 バイト長の構造に、64 ビットのオペレーティングシステムでは 16 バイト長になります。 解決策としては、COBOL レコード mystruct を C 構造で表現することです。
struct mystruct
{
char mystruct_key_1[2];
char mystruct_bin_1[4];
};
混在言語のアプリケーションに対して COBOL データレコードを C データ型に変換可能にするために、Net Express 製品は、COBOL アプリケーションや CBL_ ライブラリルーチンのインタフェースで使用される多くの基本型を持った C インクルードファイル \include\cbltypes.h (Windows) または $COBDIR/include/cbltypes.h (UNIX) を持っています。 これらのデータ型は、コピーファイル cpylib\cbltypes.cpy (Windows) または $COBDIR/source/cbltypes.cpy (UNIX) に含まれる型に直接的に対応しています。
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
ここで n=1 あるいは 2 です。
cbl_sx2_comp5_t Equivalent to: PIC s9(n) COMP-5
ここで n=3 あるいは 4 です。
cbl_sx4_comp5_t Equivalent to: PIC s9(n) COMP-5
ここで n=7 から 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 データを C 言語で移植可能な形で宣言できますが、C コンテキストでデータを操作する必要があります。 これを可能にするために、多くの COBOL ベースのデータ型を C アプリケーションのコンポーネントのコンテキストでの使用に適した形式へ変換する C ライブラリルーチンを持っています。