¡Perfecto Salvador!<br><br>Muchas gracias.<br><br>Si tengo más dudas sobre esto ya preguntaré de nuevo, de momento tengo bastantes cosas por probar.<br><br>Saludos.<br><br><div class="gmail_quote">El 21 de junio de 2012 10:06, Salvador Pozo Coronado <span dir="ltr"><<a href="mailto:salvador@conclase.net" target="_blank">salvador@conclase.net</a>></span> escribió:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hola:<br>
<br>
Con fecha miércoles, 20 de junio de 2012, 20:44:13, escribió:<br>
<br>
U> Perfecta explicación Salvador.<br>
<br>
Me alegro que se haya aclarado algo. :)<br>
<br>
U> ¿Podrías poner una implementación de la función fCompara?<br>
<br>
Para  cada  tipo  de  dato  existirá,  en  principio,  una  función de<br>
comparación diferente. Pondré un par de ejemplos.<br>
<br>
Imaginemos un tipo de dato con esta definición:<br>
<br>
----8<------<br>
typedef struct fecha {<br>
    int anno;<br>
    int mes;<br>
    int dia;<br>
};<br>
----8<------<br>
<br>
Una función que compare fechas podría ser esta:<br>
<br>
----8<------<br>
int ComparaFechas(fecha* f1, fecha *f2) {<br>
    if(f1->anno > f2->anno) return 1;<br>
    else if(f1->anno < f2->anno) return -1;<br>
    else if(f1->mes > f2->mes) return 1;<br>
    else if(f1->mes < f2->mes) return -1;<br>
    else if(f1->dia > f2->dia) return 1;<br>
    else if(f1->dia < f2->dia) return -1;<br>
    return 0;<br>
}<br>
----8<------<br>
<br>
Verás  que  los  parámetros  de  la  función  son punteros a fecha, no<br>
punteros  genéricos.  No  es  necesario  que sean genéricos, ya que el<br>
compilador es capaz de hacer la conversión:<br>
<br>
----8<------<br>
#include <stdio.h><br>
<br>
typedef struct {<br>
    int anno;<br>
    int mes;<br>
    int dia;<br>
} fecha;<br>
<br>
typedef int (*fCompara)(void*, void*);<br>
<br>
int ComparaFechas(fecha* f1, fecha *f2);<br>
<br>
int main()<br>
{<br>
    fCompara funcion;<br>
<br>
    fecha f1 = {2012,6,26};<br>
    fecha f2 = {2012,7,26};<br>
    printf("%d\n", ComparaFechas(&f1, &f2));<br>
    funcion = (fCompara)ComparaFechas;<br>
    printf("%d\n", funcion(&f1, &f2));<br>
    return 0;<br>
}<br>
<br>
int ComparaFechas(fecha* f1, fecha *f2) {<br>
    if(f1->anno > f2->anno) return 1;<br>
    else if(f1->anno < f2->anno) return -1;<br>
    else if(f1->mes > f2->mes) return 1;<br>
    else if(f1->mes < f2->mes) return -1;<br>
    else if(f1->dia > f2->dia) return 1;<br>
    else if(f1->dia < f2->dia) return -1;<br>
    return 0;<br>
}<br>
----8<------<br>
<br>
Para otro tipo de dato, por ejemplo:<br>
<br>
----8<------<br>
typedef struct {<br>
    float x;<br>
    float y;<br>
} punto;<br>
----8<------<br>
<br>
Tenemos que elegir un criterio para decidir cuando un punto es "mayor"<br>
o "menor" que otro. Podríamos ordenarlos por el valor de 'x', o por el<br>
valor  de  'y'.  Para este ejemplo los ordenaremos por su distancia al<br>
origen, cuanto más lejos estén del (0,0), mayores los consideraremos.<br>
<br>
La distancia entre dos puntos (x1,y1), (x2,y2) se calcula como:<br>
raiz_cuadrada((x1-x2)^2+(y1-y2)^2)<br>
<br>
Si el punto 2 es el origen, la función se simplifica:<br>
raiz_cuadrada(x1^2+y1^2)<br>
<br>
Y   para   nuestros   propósitos,  podemos  optimizar  la  función  de<br>
comparación,  y  no calcular la raíz cuadrada, ya que compararemos dos<br>
distancias, el resultado es el mismo si comparamos el cuadrado de esas<br>
distancias.<br>
<br>
----8<------<br>
int ComparaPuntos(punto* p1, punto *p2) {<br>
    float d1, d2;<br>
<br>
    d1 = p1->x*p1->x + p1->y*p1->y;<br>
    d2 = p2->x*p2->x + p2->y*p2->y;<br>
<br>
    if(d1 > d2) return 1;<br>
    else if(d1 < d2) return -1;<br>
    return 0;<br>
}<br>
----8<------<br>
<br>
Y  así en general, para cada tipo de dato, habrá una o varias posibles<br>
funciones de comparación.<br>
<br>
Hasta pronto.<br>
<span class="HOEnZb"><font color="#888888">--<br>
Saludos,<br>
Salvador  mailto:<a href="mailto:salvador@conclase.net">salvador@conclase.net</a><br>
Con Clase:  <a href="http://www.conclase.net" target="_blank">http://www.conclase.net</a><span onmouseout="cancel = false; window.setTimeout(WRCHideContent, 1000); clearTimeout(showTimer);" onmouseover=" var self = this; showTimer = window.setTimeout(function(){WRCShowContent({'rating':{'value':-1,'weight':-1},'flags':{'shopping':null,'social':null,'news':null,'it':null,'corporate':null,'pornography':null,'violence':null,'gambling':null,'drugs':null,'illegal':null},'single':true,'ttl':null}, self.className)},600);" class="wrc0" style="padding-right:16px;width:16px;height:16px"></span><br>

</font></span><div class="HOEnZb"><div class="h5"><br>
<br>
_______________________________________________<br>
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net">Cconclase@listas.conclase.net</a><br>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><span onmouseout="cancel = false; window.setTimeout(WRCHideContent, 1000); clearTimeout(showTimer);" onmouseover=" var self = this; showTimer = window.setTimeout(function(){WRCShowContent({'rating':{'value':-1,'weight':-1},'flags':{'shopping':null,'social':null,'news':null,'it':null,'corporate':null,'pornography':null,'violence':null,'gambling':null,'drugs':null,'illegal':null},'single':true,'ttl':null}, self.className)},600);" class="wrc0" style="padding-right:16px;width:16px;height:16px"></span><br>

Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a><span onmouseout="cancel = false; window.setTimeout(WRCHideContent, 1000); clearTimeout(showTimer);" onmouseover=" var self = this; showTimer = window.setTimeout(function(){WRCShowContent({'rating':{'value':-1,'weight':-1},'flags':{'shopping':null,'social':null,'news':null,'it':null,'corporate':null,'pornography':null,'violence':null,'gambling':null,'drugs':null,'illegal':null},'single':true,'ttl':null}, self.className)},600);" class="wrc0" style="padding-right:16px;width:16px;height:16px"></span><br>

</div></div></blockquote></div><br>