Sembra che la mia qsort non ha dato risultato corretto perché?
Domanda
Questa è la mia funzione di confronto:
int compare (const void * a, const void * b)
{
ptnode * ia = (ptnode*)a;
ptnode * ib = (ptnode*)b;
return (int)(100.f*ia->x - 100.f*ib->x );
}
e ho chiamato qsort come:
qsort(sortbase,index,sizeof(ptnode),compare);
sortbase è un array di struct mia ptnode, definito come:
typedef struct node
{
struct node *pre1;
struct node *pre2;
struct node *pre;
double x;
double y;
double maxlength;
} ptnode;
sortbase è come questo:
struct node * sortbase[1000];
Voglio ordinarli dal loro valore x, ma prima e dopo qsort, non c'è nulla di cambiato,
Perché? grazie in anticipo.
Soluzione
La funzione di confronto riceve un puntatore ai 2 elementi necessari per confrontare. Dal momento che gli elementi sono i puntatori, le esigenze funzione di confronto per puntatore maniglia per puntatori.
int compare (const void * a, const void * b)
{
ptnode * ia = *(ptnode**)a;
ptnode * ib = *(ptnode**)b;
return (int)(100.f*ia->x - 100.f*ib->x );
}
Altri suggerimenti
qsort
passa compare
all'indirizzo (nessun valore) di ciascun elemento della matrice, ossia passa un puntatore a un puntatore a una ptnode
. È necessario modificare la prima linea di compare
a:
ptnode * ia = *(ptnode**)a;
e allo stesso modo della seconda linea.