2014-12-07 2 views
1
typedef void* ListElement; 
typedef int(*CompareListElements)(ListElement, ListElement); 

ListResult listSort(List list, CompareListElements compareElement) { 
    . 
    . 
    . 
    qsort(arr, size, sizeof(*arr), compareElement); 
    . 
    . 
    . 
} 

Первые две строки, чтобы выяснить, что является CompareListElements. Когда я посылаю compareElement в качестве аргумента функции библиотеки «QSort» Я получаю эти предупреждения сообщения:типы Кастинг функции при отправке его в качестве аргумента «QSort»

passing argument 4 of 'qsort' from incompatible pointer type [enabled by default] 

Как я могу решить эту проблему?

+0

аргументы компаратора, переданные 'qsort', должны быть' const'. Это не так. – WhozCraig

ответ

4

Перепишите компаратор так соответствует тому, что ожидает qsort():

typedef int (*CompareListElements)(const void *, const void *); 

А внутри компаратора, сделать преобразование к нужному типу:

int compare_elements(const void *v1, const void *v2) 
{ 
    const RealType *p1 = v1; 
    const RealType *p2 = v2; 
    …do comparison… 
    return …; 
} 

Таким образом, вы не кастовал указатель функции вообще. RealType является то, что тип скрывается за (плохо выбрано):

typedef void *ListElement; 

вещественного типа не void; это, вероятно, какой-то тип структуры. Обратите внимание, что использование void * в качестве типа элемента списка теряет практически всю безопасность типов, доступную с C (этого, пожалуй, недостаточно для начала). Вы бы лучше:

typedef struct Element ListElement; 

или что-то в этом роде, и передавая указатели на ListElement вокруг. (См. Также Is it a good idea to typedef pointers?. Вы также можете найти How to sort an array of structs in C? полезными, и есть, несомненно, другие связанные вопросы, которые помогут.).

Смежные вопросы