Errore di compilazione vc ++ 6 incomprensibile C2664
-
29-10-2019 - |
Domanda
Non riesco a capire come correggere un errore di compilazione C2664, che mi ha fatto impazzire tutta la notte!L'errore deriva da una chiamata a qsort ().Voglio ordinare un array di ID2IX memorizzato nell'array puntato da 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 );
L'errore che ottengo da questo è:
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
Che diavolo sto facendo di sbagliato?
EDIT: Grazie a tutti. Noi programmatori C / ASM, non ci preoccupiamo per niente const.
Soluzione
Cambia la firma di sort_by_radioID
in:
int __cdecl sort_by_radioID (const void * one, const void * two)
E assicurati di eseguire il cast su const ID2IX*
all'interno della funzione.
(se __cdecl è il tipo di chiamata predefinito, puoi saltarlo. Prova senza di esso e vedi se si compila)
Altri suggerimenti
prova la firma sort_by_radioID ( const ID2IX * one , const ID2IX * two)
La tua funzione di confronto ha una firma sbagliata (qsort si aspetta un diverso tipo di puntatore a funzione).
Soluzione: cambia la tua funzione in: int sort_by_radioID (const void * one, const void *); Ricorda anche di cambiare il casting dei puntatori nel corpo della tua funzione di confronto a "const ID2DX *".