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

ENTRY を戻す関数

C のクイック・ソート関数 qsort は、比較ルーチンを使用します。 例えば、整数の配列をソートするには、 次の関数 (前述の理由から、byvalue 属性を 2 回使用する) を 使用できます。

図 76. C qsort 関数の比較ルーチンの例
 comp2:
   proc( key, element )
   returns( fixed bin(31) byvalue );

   dcl (key, element) pointer byvalue;
   dcl word based fixed bin(31);

   select;
     when( key->word < element->word )
       return( -1 );
     when( key->word = element->word )
       return( 0 );
     otherwise
       return( +1 );
   end;
 end;

次のコード・フラグメントに示すように、 C qsort 関数とこの比較ルーチンを組み合わせて使用して、 整数の配列をソートできます。

図 77. C qsort 関数を使用するためのコード例
   dcl a(1:4) fixed bin(31) init(19,17,13,11);

   put skip data( a );

   call qsort( addr(a), dim(a), stg(a(1)), comp2 );

   put skip data( a );

ただし、C 関数ポインターは PL/I ENTRY 変数と同じではないので、 C qsort 関数を単純に次のように宣言してはなりません。

図 78. qsort の誤った宣言
  dcl qsort    ext('qsort')
               entry( pointer,
                      fixed bin(31),
                      fixed bin(31),
                      entry returns( byvalue fixed bin(31) )
                    )
               options( byvalue nodescriptor );

PL/I ENTRY 変数がネスト関数を指す場合があることに注意してください (この ため、エントリー・ポイント・アドレスだけでなく逆チェーン・アドレスが必要です)。 しかし、C 関数ポインターが指す先は非ネスト関数だけに限定されるので、PL/I ENTRY 変数 と C 関数ポインターはストレージ容量を使用することすらありません。

ただし、C 関数ポインターは新しい PL/I タイプ LIMITED ENTRY と同等です。 このため、C qsort 関数は次のように宣言できます。

図 79. qsort の正しい宣言
  dcl qsort    ext('qsort')
               entry( pointer,
                      fixed bin(31),
                      fixed bin(31),
                      limited entry
                      returns( byvalue fixed bin(31) )
                    )
               options( byvalue nodescriptor );

Terms of use | Feedback

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