warning: assignment from incompatible pointer type

publicado por: Anonymous

¿Dónde estoy errando?

int (*funcion_c)(void*,void*);

int f_comparador(int* n1, int* n2){
     //Implementación...
}

funcion_c=f_comparador;  //WARNING

solución

En una cosa muy simple: void * no es lo mismo que int *.

Si bien void * puede usarse, en la declaración de funciones, para indicar cualqier tipo de puntero, esto no ocurre así en la declaración de punteros a funciones. En estos casos, la coincidencia ha de ser exacta.

Tienes varias soluciones:

  1. cambia el tipo de tu variable puntero a función. Sería lo mas correcto:

    int (*funcion_c)(int*,int*);
    
  2. Cambia el tipo de tu función … y su cuerpo, claro está:

    int f_comparador(void* n1, void* n2) { ...
    

Hay mas soluciones. Solo te las recomiendo si sabes muy bien lo que estás haciendo. Todas ellas se basan en el principio de aqui mando yo. Cuando el compilador avisa …

  1. Realiza un moldeado explícito:

    funcion_c = (int(*)(void*,void*))f_comparador;
    
  2. Usa algo intermedio. Las union son muy útiles para estas cosas:

    union {
      int ( *fv )( void *, void * );
      int ( *fi )( int *, int * );
    } paf;
    
    paf.fi = f_comparador;
    
    paf.fv( &v1, &v2 );
    
  3. Déjalo como está. Es un aviso, no un error. Dependiendo de lo que quieras haces, te funcionará … o no 😉

Insisto: las 3 últimas son para casos excepcionales, y has de saber lo que haces. Las funciones trabajan bien con los tipos correctos. Llamar a una función con un argumento inadecuado a las malas … suele producir resultados curiosos 🙂

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *