Ver Mensaje Individual
  #7 (permalink)  
Antiguo 09-12-2005, 22:04:48
Eduardo Villanueva
 
Mensajes: n/a
Predeterminado Re: qsort de FreeBSD y Linux ordenan distinto...!

Horacio Castellini wrote:
> Holas
> Me está surgiendo un problema con la portabilidad del qsort, supongamos que
> quiero ordenar un arreglo de estructuras...
>
> struct mail{
> char *autor;
> char *tema;
> };
> ......
> struct mail A[50];
> .......
> entonces defino la siguiente función para la ordenación lexicográfica...
>
> int comp_tema(const void *c1,const void *c2)
> {
> struct mail r1,r2;
> r1=*(struct mail*)c1;
> r2=*(struct mail*)c2;
> return strcmp(r1.tema,r2.tema);


// no copies las estructuras
const struct mail *r1 = (const struct mail*)c1;
const struct mail *r2 = (const struct mail*)c2;
int ret;

if (!(ret=strcmp(r1->tema,r2->tema)))
ret = strcmp(r1->autor,r2->autor);

return ret;

> }
>
> Ahora bien cuando aplico en una parte del código la ordenación del arreglo
> de registros ...
> qsort(Contener,cont,sizeof(struct mail),comp_tema);
>
> en caso de empate... es decir que comp_tema devuelve cero, tenía el
> prejuicio que ambas bibliotecas C ordenaban igual... pero no...


No es problema de bibliotecas ni de plataformas, sino de tu función de
comparación. Según tu función 2 mails son iguales *SOLO* si tienen el
mismo tema, y el orden de los elementos iguales dependerá de la
implementación del algoritmo.

Vamos que si el algoritmo cree que 2 elementos son iguales pondrá
primero el que mejor le venga, ya que el orden entre esos elementos no
importa porque *TU* le has dicho que son iguales

> Es decir en linux sale...
>
> a1 t1
> a3 t1
> a4 t1
>
> en cambio en FreeBSD
>
> a4 t1
> a1 t1
> a3 t1
>
> Como el oreden es crítico en mi caso... que solución puedo implementar para
> que esto no me suceda...


Sólo estas comparando el campo tema. Deberías comparar también con autor
cuando los temas sean iguales.

> Saludos Horacio...


Saludos
Responder Con Cita