Непонятная ошибка компиляции VC++6 C2664
Я не могу понять, как исправить ошибку компиляции C2664, которая сводила меня с ума всю ночь! Ошибка возникает из-за вызова qsort(). Я хочу отсортировать массив ID2IX, хранящийся в массиве, указанном radioID:
typedef struct id2ix { // struct maps radio id to array index
int id; // radio id
int ix;
} ID2IX;
ID2IX *RadioIDs = NULL; // radio IDs integer
.....
RadioIDs = (ID2IX*) malloc( totRadios * sizeof( ID2IX ));
if ( RadioIDs == NULL ) {
return FALSE;
}
.....
// the qsort compar function
int // sort the id2ix array by radioID
//sort_by_radioID ( ID2IX*one , ID2IX*two) { // tried this signature
sort_by_radioID ( void*one , void*two) { // tried this signature, also
return ((ID2IX*)one)->id - ((ID2IX*)two)->id;
}
// call to qsort that will not compile
qsort( RadioIDs, totRadios, sizeof(ID2IX), sort_by_radioID );
Ошибка, которую я получаю из этого:
Objects.cpp(295) : error C2664: 'qsort' : cannot convert parameter 4
from 'int (void *,void *)'
to 'int (__cdecl *)(const void *,const void *)'
None of the functions with this name in scope match the target type
Какого черта я делаю не так?
РЕДАКТИРОВАТЬ: Спасибо всем. Мы, C/ASM-кодеры, не беспокоимся, черт побери .
3 ответа
+ Изменить sort_by_radioID
Подпись к:
int __cdecl sort_by_radioID (const void * one, const void * two)
И убедитесь, что вы бросили const ID2IX*
внутри функции.
(если __cdecl является типом вызова по умолчанию, вы можете пропустить его. Попробуйте без него и посмотрите, скомпилируется ли он)
Ваша функция сравнения имеет неправильную сигнатуру (qsort ожидает другой тип указателя на функцию).
Решение: измените свою функцию на: int sort_by_radioID ( const void* one, const void*); Не забудьте также изменить приведение указателей в теле функции сравнения на const ID2DX*.
Попробуй подпись sort_by_radioID ( const ID2IX * one , const ID2IX * two)