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.

È stato utile?

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 *".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top