COBOL2002 ユーザーズガイド
- Cプログラム内で宣言された外部変数,およびCOBOLプログラム内の外部属性を持つデータ項目は,それぞれのプログラムで参照できます。外部属性を持つデータ項目の参照方法については,「20.1.5 外部属性を持つデータ項目の共用」を参照してください。
- Cプログラムは,COBOLプログラムのRETURN-CODE特殊レジスタに設定された戻り値を関数の戻り値として参照できます。COBOLプログラムが返す戻り値の有効な範囲については,「18.2 復帰コードと返却項目」を参照してください。
- CプログラムからGUIモードのCOBOLプログラムを呼び出す場合,最初のCOBOLプログラムを呼び出す前に,CBLGINTサービスルーチンを呼び出す必要があります。詳細は,「17.3 COBOLプログラムのモード」を参照してください。
- CプログラムからCOBOLプログラムを呼び出す場合,COBOL主プログラムとCOBOL副プログラムによってGOBACK文,EXIT PROGRAM文の動作が異なります。詳細については,「17.4 COBOL実行単位の終了」を参照してください。
- CプログラムからCOBOLプログラムを呼び出して,浮動小数点型データの引数渡しをする場合,Cプログラムでプロトタイプ宣言を行い,データ型を明確にする必要があります。また,COBOLプログラムの受け取り側作用対象は,次の規則に従う必要があります。
- 単精度浮動小数点型データの引数渡しをする場合,受け取り側作用対象の属性はCOMP-1とする。
- 倍精度浮動小数点型データの引数渡しをする場合,受け取り側作用対象の属性はCOMP-2とする。
- CプログラムからCOBOLプログラムを呼び出す場合,呼び出し規則を合わせる必要があります。32bit版PC(x86) COBOL2002の場合,-DllオプションでCdeclサブオプションを指定した場合,COBOLプログラムに対するCプログラムのプロトタイプ宣言は,cdeclでなければなりません。また,-DllオプションでStdcallサブオプションを指定した場合,COBOLプログラムに対するCプログラムのプロトタイプ宣言は,stdcallでなければなりません。
- 手続き部見出しにRETURNING指定がある場合,COBOLプログラムの返却項目は,そのデータ項目に対応したC言語のデータ型にしなければなりません。RETURNING指定がない場合はint型にしなければなりません。
- Cプログラムでは,COBOLプログラムの手続き部見出しのRETURNINGのデータ項目(返却項目)に設定した戻り値を参照できます。RETURNING指定がない場合は,RETURN-CODE特殊レジスタを参照します。
- CプログラムからCOBOLプログラムを呼ぶ場合は,C実行時ライブラリに,マルチスレッドに対応したダイナミックリンクライブラリを使用する必要があります。マルチスレッド対応COBOLプログラムについては,「28. マルチスレッド環境での実行」を参照してください。
- 利用者定義関数やメソッド定義は,Cプログラムから呼び出せません。
COBOLとCのデータ型の対応を,次に示します。引数や戻り値などでデータを受け渡す場合は,この規則に従う必要があります。
表20-1 COBOLのデータ項目とCプログラムの型の対応
COBOL |
C |
char |
unsigned char |
short |
unsigned short |
int,
long |
unsigned int,
unsigned long |
_int64 |
unsigned _int64 |
float |
double |
ポインタ |
構造体 |
固定長集団項目 |
|
|
|
|
|
|
|
|
× |
× |
|
○※1 |
可変長集団項目 |
|
|
|
|
|
|
|
|
× |
× |
|
× |
英字項目 |
○※2 |
○※2 |
|
|
|
|
|
|
× |
× |
|
|
英数字項目 |
○※2 |
○※2 |
|
|
|
|
|
|
× |
× |
|
|
英数字編集項目 |
|
|
|
|
|
|
|
|
× |
× |
|
|
外部10進項目 |
○※3 |
○※3 |
|
|
|
|
|
|
× |
× |
|
|
内部10進項目 |
|
|
|
|
|
|
|
|
× |
× |
|
|
2進項目 |
○※4 |
○※4 |
○※5 |
○※5 |
○※6 |
○※6 |
○※11 |
○※11 |
× |
× |
|
|
COMP-X |
○※7 |
○※7 |
○※8 |
○※8 |
○※9 |
○※9 |
○※12 |
○※12 |
× |
× |
|
|
数字編集項目 |
|
|
|
|
|
|
|
|
× |
× |
|
|
外部浮動小数点数字項目 |
|
|
|
|
|
|
|
|
× |
× |
|
|
単精度内部浮動小数点数字項目 |
× |
× |
× |
× |
× |
× |
× |
× |
○※10 |
× |
× |
× |
倍精度内部浮動小数点数字項目 |
× |
× |
× |
× |
× |
× |
× |
× |
× |
○※10 |
× |
× |
アドレスデータ項目 |
|
|
|
|
|
|
|
|
× |
× |
○ |
|
指標データ項目 |
|
|
|
|
|
|
|
|
× |
× |
|
|
日本語項目 |
|
|
|
|
|
|
|
|
× |
× |
|
|
日本語編集項目 |
|
|
|
|
|
|
|
|
× |
× |
|
|
外部ブール項目 |
|
|
|
|
|
|
|
|
× |
× |
|
|
内部ブール項目 |
|
|
|
|
|
|
|
|
× |
× |
|
|
英数字定数 |
○※2 |
○※2 |
|
|
|
|
|
|
× |
× |
|
|
数字定数 |
|
|
|
|
○ |
|
|
|
× |
× |
|
|
浮動小数点数字定数 |
× |
× |
× |
× |
× |
× |
× |
× |
× |
○ |
× |
× |
ZERO |
|
|
|
|
○ |
|
|
|
× |
× |
|
|
NULL |
|
|
|
|
|
|
|
|
× |
× |
○ |
|
オブジェクト参照項目 |
|
|
|
|
|
|
|
|
× |
× |
|
|
OLEオブジェクト参照データ項目 |
|
|
|
|
|
|
|
|
× |
× |
|
|
バリアントデータ項目 |
|
|
|
|
|
|
|
|
× |
× |
|
|
強く型付けされた集団項目 |
|
|
|
|
|
|
|
|
× |
× |
|
|
- (凡例)
- ○:指定できる
- 空白:受け渡しできるかどうかはプラットフォームに依存するため,動作保証についてはユーザ責任とする
- ×:指定してはならない。指定したときの結果は保証しない
- 注※1
- COBOLの集団項目を受け渡しする場合,Cプログラムでの境界調整を考慮して引数のデータ項目を定義する必要があります。
- COBOLの集団項目は,標準では各基本項目がすき間なく配置されるのに対し,Cプログラムでは計算機固有の境界に従って配置されます。このため,あらかじめ境界調整される分の未使用領域を定義しておくなど,計算機固有の境界調整を意識したデータを定義しておくことを推奨します。
- なお,COBOLでは,SYNCHRONIZED句を指定することで計算機固有の境界調整に従って各基本項目を配置できます。
- 注※2
- 標準文字集合で1文字の場合はchar型,2文字以上の場合は次の構造体と対応づけます(nは文字数,nameは任意のフィールド名とします)。
- struct {
- char name[n];
- };
- 注※3 SEPARATE指定なしの1けたです。
- 注※4 -Bin1Byteオプションの指定がある場合,1〜2けた(割り当てられる記憶域のサイズが1バイト)の整数です。
- 注※5
- -Bin1Byteオプションの指定がない場合,1〜4けたの整数です。
- -Bin1Byteオプションの指定がある場合,3〜4けた(割り当てられる記憶域のサイズが2バイト)の整数です。
- 注※6 5〜9けたの整数です。
- 注※7 割り当てられる記憶域のサイズが1バイトの場合,指定できます。
- 注※8 割り当てられる記憶域のサイズが2バイトの場合,指定できます。
- 注※9 割り当てられる記憶域のサイズが4バイトの場合,指定できます。
- 注※10 CプログラムからCOBOLプログラムに引数を渡す場合,プロトタイプ宣言が必要です。
- 注※11 10〜18けたの整数です。
- 注※12 割り当てられる記憶域のサイズが8バイトの場合,指定できます。
(3) 引数の受け渡し
CプログラムからCOBOLプログラムへ引数を渡す方法を,次に示します。
- Cプログラム
int SAMPLE2(int *,char *);
:
int SAMPLE1(....)
{
int cnt;
char str[80];
:
SAMPLE2(&cnt,str);
:
return(0);
}
- COBOLプログラム
IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE2.
:
LINKAGE SECTION.
01 CNT PIC S9(9) USAGE COMP.
01 STR PIC X(80).
PROCEDURE DIVISION USING BY REFERENCE CNT STR.
:
- CプログラムからCOBOLプログラムへ引数がアドレスによって渡された場合,COBOLプログラム内で受け取る引数にBY VALUEを指定してはいけません。
- COBOLプログラムは,Cプログラムから数字項目を受け取る場合,内部・外部10進項目,内部・外部浮動小数点数字項目などの数字属性を意識する必要があります。
- Cプログラム
int SAMPLE2(int,char);
int SAMPLE1(....)
{
int cnt;
char str;
:
SAMPLE2(cnt,str);
:
return(0);
}
- COBOLプログラム
IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE2.
:
LINKAGE SECTION.
01 CNT PIC S9(9) USAGE COMP.
01 STR PIC X(1).
PROCEDURE DIVISION USING BY VALUE CNT STR.
:
- CプログラムからCOBOLプログラムへ引数が値渡しされた場合,PROCEDURE DIVISION USINGでBY VALUE指定する必要があります。
- Cプログラム内で設定する引数は,すべて値渡しである必要があります。
- COBOLのデータ項目とCプログラムの型の対応については,「表20-1 COBOLのデータ項目とCプログラムの型の対応」を参照してください。
COBOLプログラムからCプログラムへ戻り値を返す方法を,次に示します。
(a) 整数型のデータ項目を返す例
- Cプログラム
extern int SAMPLE2();
:
int main()
{
int rtc;
:
rtc = SAMPLE2();
:
}
- COBOLプログラム
IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE2.
:
LINKAGE SECTION.
01 RTC PIC S9(9) USAGE COMP.
PROCEDURE DIVISION RETURNING RTC.
:
MOVE 12345 TO RTC.
EXIT PROGRAM.
(b) 構造体型のデータ項目を返す例
- Cプログラム
struct tbl{ int a; char b[10];};
extern struct tbl SAMPLE2();
int main()
{
struct tbl rtc;
:
rtc = SAMPLE2();
:
}
- COBOLプログラム
IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE2.
:
LINKAGE SECTION.
01 TBL.
02 A PIC S9(9) USAGE COMP.
02 B PIC X(10).
PROCEDURE DIVISION RETURNING TBL.
:
EXIT PROGRAM.
- 注意事項
- C言語の構造体の場合,要素の境界調整でパディング(領域間のギャップを埋めるために挿入される暗黙のFILLER項目)が挿入されます。そのほかに,構造体のサイズを最大の基本要素サイズの倍数に切り上げるため,パディングが挿入されることがあります。この場合,パディングは構造体の末尾に挿入されます。例えば上記の例の構造体tblの場合,要素の合計のサイズはCOBOLの集団項目TBLと同じ14バイトですが,構造体のサイズを4バイト(最大の基本要素のサイズ)の倍数の16バイトにするために,2バイトのパディングが構造体の末尾に挿入されます。このため,COBOLの集団項目TBLとはサイズが不一致になります。プラットフォームによっては,このサイズの不一致が原因で,引数や戻り値の受け渡しで異常終了や結果不正となることがあるため,次のどちらかの方法でC言語の構造体のサイズとCOBOLの集団項目のサイズを一致させる必要があります。
- C言語の構造体のサイズをCOBOLの集団項目のサイズに合わせる方法
構造体を詰めて配置するC言語の機能(C言語の言語仕様の#pragma packやC言語のコンパイラのコンパイラオプションで提供されている)を使って構造体tblのサイズを14バイトにします。構造体を詰めて配置するC言語の機能については,各システムのCコンパイラのリファレンスを参照してください。
- COBOLの集団項目のサイズをC言語の構造体のサイズに合わせる方法
COBOLの集団項目TBLのサイズを16バイトにするために,COBOLの集団項目TBLの末尾に次の2バイト分のFILLER項目を追加してください。
02 FILLER PIC X(2).
All Rights Reserved. Copyright (C) 2013, 2016, Hitachi, Ltd.
All Rights Reserved. Copyright (C) 2002, 2011, Microsoft Corporation.