COBOLプログラムからCプログラムを呼ぶときの規則を示します。
Cプログラムのデータ型と,対応するCOBOLのデータ項目の型を,次に示します。
Cプログラムのデータ型 | 対応するCOBOLのデータ項目の型 | ||
---|---|---|---|
unsigned char | -Bin1Byte指定あり | 符号なし2進項目(1~2けた) | 9(1) COMP ~ 9(2) COMP |
-Bin1Byte指定なし | 9(1) COMP-X ~ 9(2) COMP-X | ||
- | 英数字項目(1けた) | X(1) | |
char | -Bin1Byte指定あり | 符号付き2進項目(1~2けた) | S9(1) COMP ~ S9(2) COMP※5 |
- | 英数字項目(1けた) | X(1) | |
unsigned short | - | 符号なし2進項目(3~4けた) | 9(3) COMP ~ 9(4) COMP |
short | - | 符号付き2進項目(3~4けた) | S9(3) COMP ~ S9(4) COMP |
unsigned int | - | 符号なし2進項目(5~9けた) | 9(5) COMP ~ 9(9) COMP |
int | - | 符号付き2進項目(5~9けた) | S9(5) COMP ~ S9(9) COMP |
unsigned long | - | 符号なし2進項目(5~9けた)※1 | 9(5) COMP ~ 9(9) COMP |
符号なし2進項目(10~18けた)※2 | 9(10) COMP ~ 9(18) COMP | ||
long | - | 符号付き2進項目(5~9けた)※1 | S9(5) COMP ~ S9(9) COMP |
符号付き2進項目(10~18けた)※2 | S9(10) COMP ~ S9(18) COMP | ||
unsigned long long※4 | - | 符号なし2進項目(10~18けた) | 9(10) COMP ~ 9(18) COMP |
long long※4 | - | 符号付き2進項目(10~18けた) | S9(10) COMP ~ S9(18) COMP |
float | - | 単精度内部浮動小数点数字項目 | COMP-1 |
double | - | 倍精度内部浮動小数点数字項目 | COMP-2 |
ポインタ型 | - | アドレス名,アドレスデータ項目 | ADDRESS |
配列型 | - | アドレスデータ項目 | ADDRESS |
構造体※3 | - | 集団項目 | - |
COBOLプログラムからCプログラムへ引数を渡す方法を,次に示します。
:
WORKING-STORAGE SECTION.
01 CNT PIC S9(9) USAGE COMP.
01 STR.
02 STRCHAR PIC X(79).
02 FILLER PIC X VALUE LOW-VALUE.
:
PROCEDURE DIVISION.
:
CALL 'sample2' USING BY REFERENCE CNT STR.
:
int sample2(int *cnt, char *str)
{
:
return(0);
}
:
WORKING-STORAGE SECTION.
01 CNT PIC S9(9) USAGE COMP.
01 STR PIC X(1).
:
PROCEDURE DIVISION.
:
CALL 'sample2' USING BY VALUE CNT STR.
:
int sample2(int cnt, char str)
{
:
return(0);
}
IDENTIFICATION DIVISION.
PROGRAM-ID. SAMPLE1.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WK-1.
02 W01 PIC X(30)
VALUE 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234'.
02 FILLER PIC X VALUE LOW-VALUE. …5.
PROCEDURE DIVISION.
CALL 'SAMPLE2'
USING BY REFERENCE WK-1. …1.
CALL 'SAMPLE3'
USING BY REFERENCE ADDRESS OF WK-1. …2.
CALL 'SAMPLE4'
USING BY CONTENT LENGTH OF WK-1. …3.
CALL 'SAMPLE5'
USING BY VALUE LENGTH OF WK-1. …4.
STOP RUN.
END PROGRAM SAMPLE1.
#include <stdio.h>
int SAMPLE2(char *p_ptr_r)
{
printf("first char(r) =(%s)¥n",p_ptr_r); … 1.
:
}
int SAMPLE3(char **p_ptr_ra)
{
printf("first char(ra)=(%s)¥n",*p_ptr_ra); … 2.
:
}
int SAMPLE4(
int *p_ptr_cl /* この引数の型はUNIX32の場合 */
/* UNIX64の場合は long long * */
)
{
printf("length(p) =(%d)¥n",*p_ptr_cl); … 3.
:
}
int SAMPLE5(
int p_ptr_vl /* この引数の型はUNIX32の場合 */
/* UNIX64の場合は long long */
)
{
printf("length(p) =(%d)¥n",p_ptr_vl); … 4.
:
}
first char(r) =(ABCDEFGHIJKLMNOPQRSTUVWXYZ1234)
:
first char(ra)=(ABCDEFGHIJKLMNOPQRSTUVWXYZ1234)
:
length(p) =(31)
:
length(p) =(31)
:
CプログラムからCOBOLプログラムへ戻り値を返す方法を,次に示します。
WORKING-STORAGE SECTION.
01 RTC PIC S9(9) USAGE COMP.
:
PROCEDURE DIVISION.
:
CALL 'sample2' RETURNING RTC.
int sample2()
{
int rtc;
:
return (rtc);
}
構造体型のデータ項目をリターンする場合,COBOLプログラムとCプログラムでは境界調整によってデータのマッピング方法が異なることがあるので注意が必要です。
WORKING-STORAGE SECTION.
01 TBL.
02 A PIC S9(9) USAGE COMP.
02 B PIC X(10).
:
PROCEDURE DIVISION.
:
CALL 'sample2' RETURNING TBL.
struct tbl {int a; char b[10];};
struct tbl sample2()
{
struct tbl rtn;
:
return (rtn);
}