PL/I と C ルーチンは、同等のデータ型のデータを受け渡し、戻すことによって、「通信」します。PL/I と非 PL/I ルーチンは、外部静的変数を使用して通信することは できません。PL/I と C 間で同等のスカラー・データ型 を表 31 にリストします。
| C データ型 | PL/I データ型 |
|---|---|
| signed char | FIXED BIN(7,0) |
| unsigned char | UNSIGNED FIXED BIN(8,0) または CHAR(1) |
| signed short | FIXED BIN(15,0) |
| unsigned short | UNSIGNED FIXED BIN(16,0) |
| signed (long) int | FIXED BIN(31,0) |
| unsigned (long) int | UNSIGNED FIXED BIN(31,0) |
| float | FLOAT BIN(21)FLOAT DEC(6) |
| double | FLOAT BIN(53)FLOAT DEC(16) |
| long double | FLOAT BIN(64) FLOAT DEC 18) |
| enum | ORDINAL |
| <non-function-type> * | POINTER または HANDLE |
| <function-type> * | ENTRY LIMITED |
表の最後の行に示したように、入り口変数が LIMITED でない場合、C 関数ポインターは PL/I 入り口変数と同等ではありません。この間違いによって引き起こされるエラーは、検出が困難です。
次元数が同じで、下限と上限が同じ場合、同等タイプの配列は同等です。 C では、下限を指定することはできません。 また、実際の上限は、指定した数より 1 つ少ない数になります。 例えば、C で宣言された次の配列を考えてみます。
short x [ 6 ];
PL/I では、この配列は次のように宣言されます。
dcl x(0:5) fixed bin(15);
同等タイプの構造体および共用体も、それらのエレメントが同じオフセットにマップされる場合は、同等です。エレメント間に埋め込みがない場合は、オフセットは同じものになります。構造体 (または共用体) の エレメントがすべて UNALIGNED の場合、PL/I は埋め込みを使用しません。ALIGNED のエレメントがある場合は、AGGREGATE リストを調べて、埋め込みがあるかどうかを判別することができます。 PL/I はストリングをスカラーとみなしますが、C はそのようにみなしません。したがって、これまでの説明はストリングには適用できません。
以下に示すように、C ビット・フィールドと PL/I ビット・ストリングはあまり似ていません。
C 構造体
struct { unsigned byte1 :8;
unsigned byte2 :8;
unsigned byte3 :8;
unsigned byte4 :8;
} bytes;PL/I 構造体
dcl
1 bytes,
2 byte1 bit(8),
2 byte2 bit(8),
2 byte3 bit(8),
2 byte4 bit(8);また、他の C コンパイラーのなかには、元の構造体を、次の PL/I 構造体と同等になるように、バイトを逆の順番にしてマップするものもあります。
PL/I 構造体
dcl
1 bytes,
2 byte4 bit(8),
2 byte3 bit(8),
2 byte2 bit(8),
2 byte1 bit(8);厳密には、C には、文字ストリングはありません。あるのは、文字に対するポインターのみです。 ただし、一般的な使用法では、C ストリングは、最後の値が X'00' である文字のシーケンスになります。 したがって、以下の例では、address は、最大 30 個の非ヌル文字 を保持できる C 「ストリング」です。
char address [ 31 ];
次の PL/I 宣言が、C 「ストリング」に一番似ています。
dcl address char(30) varyingz;
C 関数の宣言では、ストリングは、通常、char* として宣言されます。 例えば、C ライブラリー関数 strcspn は、次のように宣言できます。
int strcspn( char * string1, char * string2 );
同じ関数の PL/I 宣言は次のようになります。
dcl strcspn entry( char(*) varyingz,
char(*) varyingz )
returns( fixed bin(31) );
上記の例では、C と PL/I の宣言はどちらも不完全です。完全なバージョンについては、この章の最後の方で説明します。