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 >

War es hilfreich?

Lösung

Ändern Sie die Signatur des sort_by_radioIDs 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 *'.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top