2015-02-01 2 views
1

Я пытаюсь сортировать массив указателей на structs (определение ниже) на основе значения, хранящегося в void * структуры «bucket», которые, как я знаю, являются int. Он компилирует и распечатывает мой массив ведер и их значения просто отлично, без ошибок и предупреждений, но на самом деле он не сортирует массив. Я использовал утверждения, чтобы попытаться найти где угодно, что может привести к ошибке с qsort.stdlib qsort сортировать массив указателей на структуру

Struct определения:

typedef struct _bucket{ 
    void* val; 
    char *word; 
}bucket; 

typedef struct _root{ 
    bucket **list; 
    int hashTableLength; 
}root; 

Сортировать Функция быть переданы функции QSort:

int sortFunc(const void *a, const void *b){ 
    bucket *bucketA=(bucket*)a; 
    bucket *bucketB=(bucket*)b; 
    int bucketAVal = *((int*)bucketA->val); 
    int bucketBVal = *((int*)bucketB->val); 
    assert((bucketAVal&&bucketBVal)!=0); 
    return bucketAVal-bucketBVal; 
} 

Сортировка массива и печать:

void sort(root* inRoot, int(*sortFunc)(const void *a, const void *b)){ 
    int length = inRoot->hashTableLength; 
    assert(length==11); //known length of hash array 
    for (int i = 0; i<length; i++) 
     assert(inRoot->list[i] != NULL); 
    qsort(inRoot->list, length, sizeof(bucket*), sortFunc); 
    for(int i =0; i<length; i++) 
     printf("%s was found %d times\n", inRoot->list[i]->word, *((int*)(inRoot->list[i]->val))); 
    return; 
} 

ответ

2

Функция сравнения sortFunc() получает указатель для каждого ob ект. Массив inRoot->list представляет собой массив от bucket *, так sortFunc() принимает указатели до bucket *: bucket **.

Также вычитание int допускает возможное переполнение. Используйте идиоматику 2, чтобы решить эту проблему.

int sortFunc(const void *a, const void *b) { 
    bucket **bucketA = (bucket**) a; 
    bucket **bucketB = (bucket**) b; 
    void *vA = (*bucketA)->val; 
    void *vB = (*bucketB)->val; 
    int iA = *((int*) vA); 
    int iB = *((int*) vB); 
    return (iA > iB) - (iA < iB); 
} 
Смежные вопросы