2016-07-29 14 views
0

私は、特定の順序で要素を配置する基本的なコンパレータ関数を見ています。私はqsort()を見つけました。なぜqsort()は配列の長さと配列要素のサイズを知る必要がありますか?

qsort()は、配列の長さと配列要素のサイズが引数として必要であることがわかります。なぜこれらの2つの値がsize_t lengthsize_t item_sizeである必要がありますか?

qsort(void *array, size_t length, size_t item_size, 
     int (*compar)(const void*, const void*)); 
+1

これ以外に、a)配列がどこで終わるか、b)最初のもの以外の要素にアクセスする方法(array + index * item_sizeのようなものを計算する)? – Thilo

答えて

2

配列の長さを持たない場合、並べ替える要素の数は分かりません。単一の要素の長さ(バイト数)がないと、任意の位置にある要素へのポインタをどのように構築し、その要素をソート中に移動させるかを知ることができません。

特定のパラメータが必要な理由を理解する簡単な方法の1つは、実装でどのように使用されているかを確認することです。 qsort.cの複数の実装が利用可能です。 1つを選択して、問題のパラメータがどのように使用されているかを確認できます。

+0

Gnuよりはるかに読みやすく、リンゴの実装へのリンクが良いです。 –

0

qsortのプロトタイプを見ると、それはarrayのためのパラメータとしてvoid*を受け入れます。したがって、実際には何かがあり、qsortには、int*のような別個の型指定されたポインタを渡すことができたかのように、指し示された要素のサイズを知る方法がありません。要素は、単に通常の配列のように参照することができます。

これは、これらの要素の大きさを、通常の長さパラメータの横に沿って指示することによって、手助けする必要があることを意味します。

qsortの実装は、このように、配列内のlength要素のそれぞれにアドレスarrayからのオフセットを計算し、あなたのコンパレータ機能にそれらを提供し、該当するとして周りにそれらをシャッフルすることができるようになります。

関連する問題