[C con Clase] Tipo Void

Mariano Demarchi marchi.hh en gmail.com
Dom Oct 2 02:58:57 CEST 2011


Hola metuskale, en realidad no lo necesitás para implementar la función. Lo
que sí deberías hacer es al llamar a tu función de ordenación es castear la
función de comparación a (int (*)(void*,void*)).

Tu función necesitaría un puntero al arreglo, el tamaño de cada elemento, la
cantidad de elementos y la función de comparación.

En realidad la función de ordenamiento (en este caso, pero sucede en forma
similar con las de búsqueda y otras tantas) no tiene noción acerca de la
naturaleza de los elementos del arreglo, eso queda relegado a la función de
comparación, pero dado que para realizar el ordenamiento es necesario mover
elementos se necesita saber el tamaño de estos.

Mirá esta implementación de selection sort:


void ordena(void *a,int t_size,int v_size,int (*f)(void *,void *))
{
   int i,j,min;
   void *tmp;

   tmp = malloc(t_size);
   if(!tmp) return;

   for(i = 0;i < v_size-1;i++)
   {
     min = i;
     for(j = i+1;j < v_size;j++)
     {
       if(f(a+min*t_size,a+j*t_size) >= 0)
       {
         min = j;
       }
     }
     memcpy(tmp,a+i*t_size,t_size);
     memcpy(a+i*t_size,a+min*t_size,t_size);
     memcpy(a+min*t_size,tmp,t_size);

   }
   free(tmp);

}

Esto compila con gcc por que trata la aritmética de punteros void como si se
tratase de punteros char, pero con otros compiladores habría que hacerse el
casteo explícito a char *.

Saludos

El 1 de octubre de 2011 11:55, Pablo Alejandro Herrero <pablusplus en gmail.com
> escribió:

> Hola. Tenés varias opciones pero lo mas rápido que se me ocurre es que
> indiques el tipo de dato con otro parámetro:
>
>
> #define   ENTERO    0
> #define   FLOTANTE 1
> #define   CADENA    2
>
> bubble(void *array, tipo_retorno *puntero_a_funcion(tipo_args), int tipo){
>     ...
>     switch(tipo)
>          case ENTERO:
>               ...(int *)array[índice_a_elemento]...
>          break;
>          case FLOTANTE:
>                ...(float *)array[índice_a_elemento]...
>          break;
>          case CADENA:
>                ...(char *)array[índice_a_elemento]...
>           break;
>          default:
>          break;
> }
>
>
> seria algo asi: indicar el tipo de dato, y usar una selección explícita de
> tipo (explicit cast). Cuidado con: hay que indicar los argumentos de la
> funció en puntero_a_función (yo usaria el operador ... para definirla,
> aunque después tenés que tomar los parámetros desde la pila) y lo otro es
> que indice_a_elementos no debe exceder el tamaño del array porque sino tenés
> una excepción por violacion de acceso a memoria. Espero te sirva!
>
>
> El 1 de octubre de 2011 06:02, metuskale <metuskale en gmail.com> escribió:
>
> Buenas, estoy intentando realizar unas funciones lo mas genéricas
>> posibles con el fin de crear una pequeña librería y re aprovecharla en
>> varias practicas.
>> Lo primero que quiero hacer, y que servirá de ejemplo es un bubbleSort
>> que reciba un array de tipo void y un puntero a una funcion de
>> comparacion en funcion del tipo que se quiera ordenar.
>> El problema que tengo y no se como resolver es como usar y convertir
>> el tipo void o void* del array al tipo correcto, es decir:
>>
>> void bubble (void* datos, "puntero a funcion") {
>>
>>
>>
>> }
>>
>> Saludos y gracias a todos
>>
>> --
>> David de Alvarado Lacruz
>>
>> _______________________________________________
>> Lista de correo Cconclase Cconclase en listas.conclase.net
>> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
>> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>>
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20111001/6d63ce3e/attachment-0001.html>


Más información sobre la lista de distribución Cconclase