Incomprensible VC++6 error de compilación C2664
-
29-10-2019 - |
Pregunta
No puedo entender cómo corregir un error de compilación C2664, que me ha llevado loco toda la noche!El error surge a partir de una llamada a qsort().Quiero ordenar una matriz de ID2IX almacenados en el array apuntado por radioIDs:
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 );
El error que me salga de esto es:
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
¿Qué diablos estoy haciendo mal?
EDITAR:Gracias, a todo el mundo. Nosotros C/ASM codificadores, no nos molestamos 'bout no sirve para nada const.
Solución
Cambio sort_by_radioID
la firma a:
int __cdecl sort_by_radioID(const void* uno, const void* dos)
Y asegúrese de que usted echa para const ID2IX*
dentro de la función.
(si __cdecl es el valor predeterminado de tipo de llamada, se puede omitir.Probar sin él y ver si compila)
Otros consejos
pruebe la firma sort_by_radioID ( const ID2IX * one , const ID2IX * two)
Su función de comparación tiene firma incorrecta (QSort espera diferente tipo de puntero de función).
Solución: Cambie su función a: int sort_by_radioid (Const Void * One, Const Void *); Recuerde también cambiar la fundición de los punteros en el cuerpo de su función de comparación a 'const id2dx *'.