データ・タイプの互換性

高水準言語は、それぞれさまざまなデータ型を持っています。 複数の言語で作成されているプログラム間でデータを受け渡す場合は、それらの違いについて熟知している必要があります。

ILE C プログラミング言語の一部のデータ・タイプには、他の言語と直接的に対応するものがありません。 ただし、 ILE C データ・タイプを使用する他の言語でデータ・タイプをシミュレートすることができます。

以下の表は、ILE RPG との ILE C データ・タイプの互換性を示しています。

表 1. ILE C データ・タイプと ILE RPG との互換性
プロトタイプでの ILE C 宣言 フリー・フォーム ILE RPG 構文 ILE RPG D 仕様、列 33 から 39 まで 長さ コメント
char [n]
文字 *
       CHAR(n)  
       nA  
n 文字の配列 (n は、1 から 16773104 まで)。

ヌル終了ストリング・パラメーターの場合には、VALUE および OPTIONS(*STRING) キーワードを使用して、プロトタイプ化されたパラメーターをポインターとしてコード化します。

char
       IND 
       1N 
1 標識。
char[n]
       ZONED(n)
       nS 0
n ゾーン 10 進数。
_Packed struct {unsigned short i; char[n]}
       VARCHAR(n)
       nA VARYING
n+2 可変長フィールド (i は指定した長さ、n は最大長)。

注: n が 65535 より大きい場合は、構造体の最初のエレメントは符号なし int であり、長さは n+4 です。

_Packed struct {unsigned int i; char[n]}
       VARCHAR(n : 4)
       nA VARYING(4)
n+4 可変長フィールド (i は指定した長さ、n は最大長)。
wchar_t[n]
       UCS2(n)
       nC
2n UCS-2 文字の配列。

注: RPG UCS-2 タイプでは、CCSID(1200) を指定することで UTF-16 データもサポートされます。

_Packed struct {unsigned short i; wchar_t[n]}
       VARUCS2(n)
       nC VARYING
2n+2 可変長 UCS-2 フィールド (i は指定した長さ、n は最大長)。

注: n が 65535 より大きい場合は、構造体の最初のエレメントは符号なし int であり、長さは 2n+4 です。

注: RPG UCS-2 タイプでは、CCSID(1200) を指定することで UTF-16 データもサポートされます。

_Packed struct {unsigned int i; wchar_t[n]}
       VARUCS2(n : 4)
       nC VARYING(4)
2n+4 可変長 UCS-2 フィールド (i は指定した長さ、n は最大長)。

注: RPG UCS-2 タイプでは、CCSID(1200) を指定することで UTF-16 データもサポートされます。

wchar_t[n]
       GRAPH(n)
       nG 
2n グラフィック文字の配列。
_Packed struct {unsigned short i; wchar_t[n]}
       VARGRAPH(n)
       nG VARYING
2n+2 可変長グラフィック・フィールド。i は指定した長さで、n は最大長です。

注: n が 65535 より大きい場合は、構造体の最初のエレメントは符号なし int であり、長さは 2n+4 です。

_Packed struct {unsigned int i; wchar_t[n]}
       VARGRAPH(n : 4)
       nG VARYING(4)
2n+4 可変長グラフィック・フィールド。i は指定した長さで、n は最大長です。
char[n]
        DATE
        D 
8, 10 日付フィールド。
char[n]
        TIME 
        T 
8 時刻フィールド。
char[n]
        TIMESTAMP 
        Z 
20-32 タイム・スタンプ・フィールド
short int
       INT(5)
       5I 0
2 整数フィールド
short unsigned int
       UNS(5)
       5U 0
2 符号なし整数フィールド
int
      INT(10)
      10I 0
4 整数フィールド
unsigned int
      UNS(10)
      10U 0
4 符号なし整数フィールド
long int
      INT(10)
      10I 0
4 整数フィールド
long unsigned int
      UNS(10)
      10U 0
4 符号なし整数フィールド
long long int
      INT(20)
      20I 0
8 8 バイトの整数フィールド。
long long unsigned int
      UNS(20)
      20U 0
8 8 バイトの符号なし整数フィールド。
struct {unsigned int : n}x; サポートなし。 サポートなし。 4 4 バイトの符号なし整数。ビット・フィールド。
float FLOAT(4) 4F 4 4 バイトの浮動小数点
double FLOAT(8) 8F 8 8 バイトの double 型
long double FLOAT(8) 8F 8 8 バイトの long double。
_Decimal32 サポートされていません サポートされていません 4 4 バイトの 10 進浮動小数点
_Decimal64 サポートされていません サポートされていません 8 8 バイトの 10 進浮動小数点。
_Decimal128 サポートされていません サポートされていません 16 16 バイトの 10 進浮動小数点
enum INT(p) pI 1、2、4 列挙型 n = 1,2,4: p = 3,5,10

enum 値を使用して ILE RPG 名前付き定数を定義します。

*
       POINTER
        * 
16 ポインター。
decimal(n,p)
       PACKED(n:p)
       nP p
n/2+1 パック 10 進数。 n は、必ず 30 以下。
union.element キーワード POS(1) キーワード OVERLAY (データ構造名) を持つ <type> エレメントの長さ 共用体のエレメント。
data_type[n] キーワード DIM(n) を持つ <type> キーワード DIM(n) を持つ <type> 16 C がポインターを渡す先の配列
struct データ構造 データ構造 n 構造体。 RPG データ構造体に ALIGN キーワードがない場合は、構造体で _Packed 修飾子を使用します。

C 構造体に _Packed 修飾子がない場合は、RPG データ構造体で ALIGN キーワードを使用します。

関数を指すポインター。
        POINTER(*PROC)
        * 
キーワード PROCPTR 付き
16 16 バイトのポインター

以下の表は、ILE COBOL との ILE C データ・タイプの互換性を示しています。

表 2. ILE C データ型と ILE COBOL との互換性
プロトタイプでの ILE C 宣言 ILE COBOL の LINKAGE SECTION 長さ コメント
char [n]
文字 *
PIC X(n). n 文字の配列 (n は、1 から 3,000,000 まで)。
char PIC 1 INDIC .. 1 標識。
char[n] PIC S9(n) DISPLAY n ゾーン 10 進数。
wchar_t[n] PIC G(n) 2n グラフィック・データ型
_Packed struct {short i; char[n]}
05 VL-FIELD。
  10 i PIC S9(4)
COMP-4。
 10 data PIC X(n).
n+2 可変長フィールド (i は指定した長さ、n は最大長)。
char[n] PIC X(n). 6 日付フィールド。
char[n] PIC X(n). 5 日フィールド
char PIC X. 1 曜日フィールド
char[n] PIC X(n). 8 時刻フィールド。
char[n] PIC X(n). 26 タイム・スタンプ・フィールド
short int PIC S9(4) COMP-4 2 -9999~+9999 の 2 バイト符号付き整数。
short int PIC S9(4) BINARY 2 -9999~+9999 の 2 バイト符号付き整数。
int PIC S9(9) COMP-4 4 -999999999~+999999999 の 4 バイト符号付き整数。
int PIC S9(9) BINARY. 4 -999999999~+999999999 の 4 バイト符号付き整数。
int USAGE IS INDEX 4 4 バイトの整数。
long int PIC S9(9) COMP-4 4 -999999999~+999999999 の 4 バイト符号付き整数。
long int PIC S9(9) BINARY. 4 -999999999~+999999999 の 4 バイト符号付き整数。
struct {unsigned int : n}x;
PIC 9(9) COMP-4
PIC X(4)
4 ビット・フィールドは 16 進数リテラルを使用して操作可能。
float USAGE IS COMP-1 4 4 バイトの浮動小数点
double USAGE IS COMP-2 8 8 バイトの double 型
long double サポートなし。 8 8 バイトの long double。
enum サポートなし。 1、2、4 列挙型
* USAGE IS POINTER 16 ポインター。
decimal(n,p) PIC S9(n-p)V9(p) COMP-3 n/2+1 パック 10 進数。
decimal(n,p) PIC S9(n-p) 9(p) PACKED-DECIMAL n/2+1 パック 10 進数。
union.element REDEFINES エレメントの長さ 共用体のエレメント。
data_type[n] OCCURS 16 C がポインターを渡す先の配列
struct
01 レコード
05 field1
05 field2
n 構造体。 struct に _Packed 修飾子を使用。 構造体の内容を変更する場合、渡す構造は、構造体を指すポインターとして渡すことが必要。
関数を指すポインター。 PROCEDURE-POINTER 16 プロシージャーへのポインター (16 バイト)
サポートなし。 PIC S9(18) COMP-4 8 8 バイト整数
サポートなし。 PIC S9(18) BINARY 8 8 バイト整数

以下の表は、ILE CL との ILE C データ・タイプの互換性を示しています。

テーブル3。 ILE C データ・タイプと ILE CL との互換性
プロトタイプでの ILE C 宣言 CL 長さ コメント
char [n]
文字 *
*CHAR LEN(&N) n 文字の配列 (n は、1 から 32766 まで)。 ヌル終了ストリング。 例: CHGVAR &V1 VALUE (&V *TCAT X'00')。&V1 は、&V より 1 バイトだけ大きな値になります。
char *LGL 1 '1' または '0' を入れる。
_Packed struct {short i; char[n]} サポートなし。 n+2 可変長フィールド (i は指定した長さ、n は最大長)。
整数型 *INT LEN(&N) 2, 4, 8 2、4、または 8 バイトの符号付き整数。 (CL では、1 バイトの整数タイプはサポートされません)
*UINT LEN(&N) 2, 4, 8 2、4、または 8 バイトの符号なし整数。 (CL では、1 バイトの整数タイプはサポートされません)
浮動小数点定数 CL 定数のみ 4 4 バイトまたは 8 バイトの浮動小数点
decimal(n,p) *DEC n/2+1 パック 10 進数。 n の限度は 15。p の限度は 9。
union.element サポートなし。 エレメントの長さ 共用体のエレメント。
struct サポートなし。 n 構造体。 struct に _Packed 修飾子を使用。
関数を指すポインター。 サポートなし。 16 16 バイトのポインター

次の表は、OPM RPG/400®との ILE C データ・タイプの互換性を示しています。

テーブル4。 ILE C データ・タイプと OPM RPG/400
プロトタイプでの ILE C 宣言 OPM RPG/400 I 仕様、DS サブフィールド列仕様 長さ コメント
char [n]
文字 *
1                   10 n 文字の配列 (n は、1 から 32766 まで)。
char *INxxxx 1 *IN で始まる変数である標識。
char[n] 1 番目 (d>=0) n ゾーン 10 進数。 n の限度は 30。
_Packed struct {unsigned short i; char[n]} サポートなし。 n+2 可変長フィールド (i は指定した長さ、n は最大長)。
_Packed struct {unsigned int i; char[n]} サポートなし。 n+4 可変長フィールド (i は指定した長さ、n は最大長)。
wchar_t[n] サポートなし。 2n UCS-2 文字の配列。
_Packed struct {unsigned short i; wchar_t[n]} サポートなし。 2n+2 可変長 UCS-2 フィールド (i は指定した長さ、n は最大長)。
_Packed struct {unsigned int i; wchar_t[n]} サポートなし。 2n+4 可変長 UCS-2 フィールド (i は指定した長さ、n は最大長)。
wchar_t[n] サポートなし。 2n グラフィック文字の配列。
_Packed struct {unsigned short i; wchar_t[n]} サポートなし。 2n+2 可変長グラフィック・フィールド。i は指定した長さで、n は最大長です。
_Packed struct {unsigned int i; wchar_t[n]} サポートなし。 2n+4 可変長グラフィック・フィールド。i は指定した長さで、n は最大長です。
char[n] サポートなし。 6, 8, 10 日付フィールド。
char[n] サポートなし。 8 時刻フィールド。
char[n] サポートなし。 26 タイム・スタンプ・フィールド
short int B 1 20 2 -9999~+9999 の 2 バイト符号付き整数。
int B 1 40 4 -999999999~+999999999 の 4 バイト符号付き整数。
long int B 1 40 4 -999999999~+999999999 の 4 バイト符号付き整数。
long long int サポートなし。 8 8 バイトの整数フィールド。
struct {unsigned int : n}x; サポートなし。 4 4 バイトの符号なし整数。ビット・フィールド。
float サポートなし。 4 4 バイトの浮動小数点
double サポートなし。 8 8 バイトの double 型
long double サポートなし。 8 8 バイトの long double。
_Decimal32 サポートなし。 4 4 バイトの 10 進浮動小数点
_Decimal64 サポートなし。 8 8 バイトの 10 進浮動小数点。
_Decimal128 サポートなし。 16 16 バイトの 10 進浮動小数点
enum サポートなし。 1、2、4 列挙型
* サポートなし。 16 ポインター。
decimal(n,p) P 1 n/2+1d n/2+1 パック 10 進数。 n は、必ず 30 以下。
union.element 位置 1 で開始されるデータ構造体サブフィールド エレメントの長さ 共用体のエレメント。
data_type[n] E-SPEC 配列 16 C がポインターを渡す先の配列
struct データ構造 n 構造体。 struct に _Packed 修飾子を使用。
関数を指すポインター。 サポートなし。 16 16 バイトのポインター

次の表は、OPM COBOL/400との ILE C データ・タイプの互換性を示しています。

テーブル5。 ILE C データ・タイプと OPM COBOL/400
プロトタイプでの ILE C 宣言 OPM COBOL の LINKAGE SECTION 長さ コメント
char [n]
文字 *
PIC X(n). n 文字の配列 (n は、1 から 3,000,000 まで)。
char PIC 1 INDIC .. 1 標識。
char[n] PIC S9(n) USAGE IS DISPLAY n ゾーン 10 進数。 n の限度は 18。
_Packed struct {short i; char[n]}
05 VL-FIELD。
  10 i PIC S9(4)
COMP-4。
 10 data PIC X(n).
n+2 可変長フィールド (i は指定した長さ、n は最大長)。
char[n] PIC X(n). 6, 8, 10 日付フィールド。
char[n] PIC X(n). 8 時刻フィールド。
char[n] PIC X(n). 26 タイム・スタンプ・フィールド
short int PIC S9(4) COMP-4 2 2 バイトの符号付き整数。範囲は -9999 から +9999 まで。
int PIC S9(9) COMP-4 4 -999999999~+999999999 の 4 バイト符号付き整数。
long int PIC S9(9) COMP-4 4 -999999999~+999999999 の 4 バイト符号付き整数。
struct {unsigned int : n}x;
PIC 9(9) COMP-4
PIC X(4)
4 ビット・フィールドは 16 進数リテラルを使用して操作可能。
float サポートなし。 4 4 バイトの浮動小数点
double サポートなし。 8 8 バイトの double 型
long double サポートなし。 8 8 バイトの long double。
enum サポートなし。 1、2、4 列挙型
* USAGE IS POINTER 16 ポインター。
decimal(n,p) PIC S9(n-p)V9(p) COMP-3 n/2+1 パック 10 進数。 n と p の限度は 18。
union.element REDEFINES エレメントの長さ 共用体のエレメント。
data_type[n] OCCURS 16 C がポインターを渡す先の配列
struct 01 record n 構造体。 struct に _Packed 修飾子を使用。 構造体の内容を変更する場合、渡す構造は、構造体を指すポインターとして渡すことが必要。
関数を指すポインター。 サポートなし。 16 16 バイトのポインター
サポートなし。 PIC S9(18) COMP-4 8 8 バイト整数

以下の表は、CL との ILE C データ型の互換性を示しています。

テーブル6。 ILE C CL とのデータ・タイプの互換性
プロトタイプでの ILE C 宣言 CL 長さ コメント
char [n]
文字 *
*CHAR LEN(&N) n 文字の配列 (n は、1 から 32766 まで)。 ヌル終了ストリング。 例: CHGVAR &V1 VALUE (&V *TCAT X'00')。&V1 は、&V より 1 バイトだけ大きな値になります。 n の限度は 9999。
char *LGL 1 '1' または '0' を入れる。
_Packed struct {short i; char[n]} サポートなし。 n+2 可変長フィールド (i は指定した長さ、n は最大長)。
整数型 *INT LEN(&N) 2, 4 2 または 4 バイトの符号付き整数。 (CL では、1 バイトの整数タイプはサポートされません)
*UINT LEN(&N) 2, 4 2 または 4 バイトの符号なし整数。 (CL では、1 バイトの整数タイプはサポートされません)
浮動小数点定数 CL 定数のみ 4 4 バイトまたは 8 バイトの浮動小数点
decimal(n,p) *DEC n/2+1 パック 10 進数。 n の限度は 15。p の限度は 9。
union.element サポートなし。 エレメントの長さ 共用体のエレメント。
struct サポートなし。 n 構造体。 struct に _Packed 修飾子を使用。
関数を指すポインター。 サポートなし。 16 16 バイトのポインター

次の表は、コマンド行 CL 呼び出しから ILE C プログラムに引数を渡す方法を示しています。

表 7. コマンド・ライン CL 呼び出しから ILE C プログラムに渡される引数
コマンド行の引数 Argv 配列 ILE C 引数
  argv[0] "LIB/PGMNAME"
  argv[1..255] 通常のパラメーター
'123.4' argv[1] "123.4"
123.4 argv[2] 0000000123.40000D
'Hi' argv[3] "Hi"
Lo argv[4] "LO"

CL 文字配列 (ストリング) は、 ILE C プログラムに渡されるときに NULL 終了になりません。 このような引数を制御言語プログラムから受け取る C プログラムでは、ストリングがヌル終了することは見込めません。 QCMDEXC を使用すれば、すべての引数をヌル終了させることができます。

次の表は、コンパイル済み CL プログラムから ILE C プログラムに CL 定数が渡される方法を示しています。

表 8. コンパイルされた CL プログラムから ILE C プログラムに渡される CL 定数
制御言語プログラム引数のコンパイル Argv 配列 ILE C 引数
  argv[0] "LIB/PGMNAME"
  argv[1..255] 通常のパラメーター
'123.4' argv[1] "123.4"
123.4 argv[2] 0000000123.40000D
'Hi' argv[3] "Hi"
Lo argv[4] "LO"

コマンド処理プログラム (CPP) は、 表 8に定義されている CL 定数を渡します。 コマンド作成 (CRTCMD) コマンドを使用して独自の CL コマンドを作成し、 ILE C プログラムを呼び出すときに、 ILE C プログラムをコマンド処理プログラムとして定義します。

次の表は、コンパイル済み CL プログラムから ILE C プログラムに CL 変数が渡される方法を示しています。 CL から C への引数の受け渡しは、すべて参照によって行われます。

表 9. コンパイルされた CL プログラムから ILE C プログラムに渡される CL 変数
CL 変数 ILE C 引数
DCL VAR(&v) TYPE(*CHAR) LEN(10) VALUE('123.4') 123.4
DCL VAR(&d) TYPE(*DEC) LEN(10) VALUE(123.4) 0000000123.40000D
DCL VAR(&h) TYPE(*CHAR) LEN(10) VALUE('Hi') こんにちは
DCL VAR(&i) TYPE(*CHAR) LEN(10) VALUE(Lo) LO
DCL VAR(&j) TYPE(*LGL) LEN(1) VALUE('1') 1

CL 変数および数値定数は、ヌル終了ストリングを持つ ILE C プログラムには渡されません。 文字定数と論理リテラルは、ヌル終了ストリングとして受け渡されますが、ブランクで埋め込まれてはいません。 パック 10 進数などの数値制約は、15,5 (8 バイト) として受け渡されます。