変数が精度 7 以下の FIXED BIN として宣言された場合、 その変数は PL/I for MVS & VM 以前の環境では 2 バイトのストレージを占有しましたが、 Enterprise PL/I の環境では 1 バイトのストレージを占有します。 変数が構造体の一部をなす場合は、通常、このために構造体のマップ方法が 変わり、プログラムの動作に影響する可能性があります。 例えば、構造体がファイルから読み込まれる場合、 Enterprise PL/I で読み込まれるバイト数は、PL/I for MVS & VM または以前の PL/I リリースの 場合より少なくなります。
この違いを回避するには、変数の精度を 8 から 15 まで (両端の値を含む) の範囲の値に 変更できます。
この相違点のために問題が発生している場所を見つけるのに役立てるために、コンパイラーは 、メッセージ IBM1044 を出して、精度が 7 以下の FIXED BIN にフラグを立てます。
DEFAULT コンパイラー・オプションの (NO)BIN1ARG サブオプションは、プロトタイプ化されていない関数に渡される 1 バイトの REAL FIXED BIN 引数をコンパイラーが処理する方法を制御します。
以下の例について見てみましょう。
dcl f1 ext entry; dcl f2 ext entry( fixed bin(15) ); call f1( 1b ); call f2( 1b );
DEFAULT(BIN1ARG) を指定した場合、コンパイラーは 1 バイトの FIXED BIN(1) 引数のアドレスをルーチン f1 に渡し、2 バイトの FIXED BIN(15) 引数のアドレスをルーチン f2 に渡します。 しかし DEFAULT(NOBIN1ARG) を指定した場合には、コンパイラーはどちらのルーチンに対しても、2 バイトの FIXED BIN(15) 引数のアドレスを渡します。
ルーチン f1 が COBOL ルーチンの場合、そのルーチンに対して 1 バイトの整数引数を渡すと、COBOL は 1 バイトの整数をサポートしていないため問題が生じることに注意してください。 この場合、DEFAULT(NOBIN1ARG) を使用するのも有用ですが、エントリー宣言で引数属性を指定する方が良いでしょう。
それで BIN1ARG がデフォルトのサブオプションですが、互換性を増すためには NOBIN1ARG サブオプションを指定する方が助けになる場合もあります。