C のクイック・ソート関数 qsort は、比較ルーチンを使用します。 例えば、整数の配列をソートするには、 次の関数 (前述の理由から、byvalue 属性を 2 回使用する) を 使用できます。
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 関数とこの比較ルーチンを組み合わせて使用して、 整数の配列をソートできます。
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 関数を単純に次のように宣言してはなりません。
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 関数は次のように宣言できます。
dcl qsort ext('qsort')
entry( pointer,
fixed bin(31),
fixed bin(31),
limited entry
returns( byvalue fixed bin(31) )
)
options( byvalue nodescriptor );