Unverständlicher VC ++ 6-Kompilierungsfehler C2664
-
29-10-2019 - |
Frage
Ich kann nicht herausfinden, wie ich einen Kompilierungsfehler C2664 beheben kann, der mich die ganze Nacht verrückt gemacht hat!Der Fehler entsteht durch einen Aufruf von qsort ().Ich möchte ein ID2IX-Array sortieren, das in dem Array gespeichert ist, auf das radioIDs zeigen:
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 );
Der Fehler, den ich dabei bekomme, ist:
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
Was zum Teufel mache ich falsch?
BEARBEITEN: Vielen Dank an alle. Wir C / ASM-Codierer kümmern uns nicht um keine verdammte >
Lösung
Ändern Sie die Signatur des sort_by_radioID
s in:
int __cdecl sort_by_radioID (const void * eins, const void * zwei)
Und stellen Sie sicher, dass Sie innerhalb der Funktion in
const ID2IX*
umwandeln.(Wenn __cdecl der Standardanruftyp ist, können Sie ihn überspringen. Versuchen Sie es ohne und prüfen Sie, ob er kompiliert wird.)
Andere Tipps
versuchen Sie den sort_by_radioID ( const ID2IX * one , const ID2IX * two)
der Signatur
Ihre Vergleichsfunktion hat eine falsche Signatur (QSort erwartet unterschiedliche Funktionszeiger).
Lösung: Ändern Sie Ihre Funktion an: int sort_by_radioid (const void * eins, const void *); Denken Sie daran, auch das Gießen von Zeigern im Körper Ihrer Vergleichsfunktion zu wechseln zu 'const id2dx *'.