2

strucへのポインタの配列をソートする必要があります。実際、構造体への特定のポインターが配列に存在するかどうかを確認するために、アドレス間を検索する必要があります。残念ながら、これらの構造の中に「匹敵する」ものは何もないので、アドレスだけで並べ替えたいと思います。私のコードはそのようなものです:

item* arr[SIZE];
//something is inserted
qsort(arr, SIZE, sizeof(item*), (void*)compare_funct); 
//CUT
bsearch(curr, arr, SIZE, sizeof(item*), (void*)compare_funct);

intへのポインタをキャストしてその差を返すだけでcompare_functを作成しようとしましたが、機能しないようです。特に、bsearchを実行すると、要素が配列内に含まれていることがわかっていても、戻り値として常にNULLが返されます。

4

2 に答える 2

5
int cmp_items(void const *p, void const *q)
{
    item const *a = *(item const **)p, *b = *(item const **)q;
    return b - a;
}

(にキャストcompare_functしないでください。タイプチェックをオフにすると、未定義の動作が発生するvoid*以外は何も起こりません。)

編集:@R ..が指摘しているように、上記は、共通の配列aを指さない限り、未定義の動作を示します。b完全な移植性のために(ただし、すぐに理解できることを犠牲にして)、次を使用する必要があります

int compare_pointers(void const *p, void const *q)
{
    return memcmp(p, q, sizeof(item *));
}
于 2011-05-29T10:47:48.587 に答える
0

ここを見てください。

これは、charへのポインタではなく、structへのポインタと考えるとかなりよく説明されています。

基本的には、(void *)にキャストされたstruct **を渡し、それをstruct **逆参照に戻して、struct *を取得し、比較を行うという考え方です。

qsortでキャストを正しく行うのは難しい場合があります。

于 2011-05-29T10:17:13.633 に答える