[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