Rational Developer for System z
PL/I for Windows, Version 8.0, プログラミング・ガイド

データが受け渡される方法

PL/I および C のいずれも、データのさまざまな受け渡し方法をサポートします。 これらの方法を理解するには、以下の用語を知っておく必要があります。

パラメーター
PL/I プロシージャーまたは関数の定義で宣言された変数。例えば、次の PL/I 関数定義で、seed はパラメーターです。
  funky:
     proc( seed )
     returns( fixed bin(31) );

     dcl seed fixed bin(31);
         .
         .
         .
  end funky;
引数
ルーチンに実際に受け渡される変数または値。関数 funky (上記の例) が rc = funky( seed ); によって呼び出される場合、seed は引数です。
By value
引数の値が受け渡されます。呼び出し側ルーチンが by value で引数を受け渡す場合、呼び出し先ルーチンは、元の引数を変更できません。
By address
引数のアドレスが受け渡されます。呼び出し側ルーチンが by address で引数を受け渡す場合、呼び出し先ルーチンは、呼び出し側の引数を変更できます。

C はすべてのパラメーターを by value で受け渡しますが、PL/I (デフォルトで) はパラメーターを by address で受け渡します。 PL/I は、配列、構造体、共用体、および * として宣言された長さを持つストリングを除いて、by value でのパラメーターの受け渡しもサポートします。

PL/I 言語解説書」で詳しく説明されているように、BYADDR または BYVALUE 属性で by address または by value を宣言することによって、パラメーターをそれらのいずれで受け渡すかを指示できます。以下の例では、modf への最初のパラメーターは by value で受け渡され、2 番目のパラメーターは by address で受け渡されます。

  dcl modf entry( float bin(53) byvalue,
                  float bin(53) byaddr )
           returns( float bin(53) );

対応する C の宣言は次のとおりです。

  double modf( double x, double * intptr );

宣言で BYADDR または BYVALUE 属性を明示しない場合、そのエントリーのオプション・リストでそれらを指定できます。次の宣言はオプション・リストを 使用しており、上記の例と同等なものになっています。

  dcl modf entry( float bin(53),
                  float bin(53) byaddr )
           returns( float bin(53) )
           options( byvalue );

パラメーターが by address で受け渡される場合でも、その値が、受け取り側ルーチンによって変更されないこともあります。PL/I では、属性 NONASSIGNABLE (または NONASGN) をそのパラメーターの宣言に追加することによって、このことを指示することができます。次の部分的宣言は、関数 strcspn へのいずれの引数も、その関数によって変更されないことを 指示します。

  dcl strcspn entry( nonasgn char(*) varyingz,
                     nonasgn char(*) varyingz )
              returns( fixed bin(31) );

対応する C の宣言は次のとおりです。

  int strcspn( const char * string1, const char * string2 );

ルーチンは、それを呼び出すすべてのルーチンとの間で、データの受け渡しについて同意する必要があります。このような種類のミスマッチを検出する ための十分な情報をコンパイラーに提供することによって、問題を回避することができます。 例えば、次の宣言は、技術的には、上記のサンプル・コードにおける modf の 宣言と同等ですが、この宣言を使用すると、すべての引数のアドレスを 2 番目の引数として受け渡す ことができます。以前の宣言では、2 番目の引数は正しいタイプを持つ必要があります。

  dcl modf entry( float bin(53),
                  pointer )
           returns( float bin(53) )
           options( byvalue );

最後に、PL/I は、いくつかのデータ型 (ストリング、配列、構造体、および共用体) を受け渡す 場合、デフォルトで、データ・エクステント (最大のストリングの長さ、配列境界など) を記述する 記述子 も受け渡します。 C ルーチンは PL/I 記述子を使用できないため、C と PL/I のルーチン間で記述子が受け渡されないように する必要があります。C エントリーの宣言で OPTIONS 属性に NODESCRIPTOR オプションを追加する ことによって、これを行うことができます。例えば、次のようにします。

  dcl strcspn entry( nonasgn byaddr char(*) varyingz,
                     nonasgn byaddr char(*) varyingz )
              returns( fixed bin(31) )
              options( nodescriptor );

Terms of use | Feedback

This information center is powered by Eclipse technology. (http://www.eclipse.org)