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.

¿Fue útil?

Solución

Cambio sort_by_radioIDla 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 *'.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top