Кажется, мой qsort не дал правильный результат, почему? - PullRequest
1 голос
/ 02 декабря 2011

это моя функция сравнения:

   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 );
    }

и я вызвал qsort как:

qsort(sortbase,index,sizeof(ptnode),compare);

sortbase - это массив моего struct ptnode, определенный как:

typedef struct node
{
    struct node  *pre1;
    struct node  *pre2;
    struct node  *pre;
    double          x;
    double y;
    double maxlength;
} ptnode;

sortbase выглядит следующим образом:

struct node * sortbase[1000];

Я хочу отсортировать их по значению x, но до и после qsort ничего не изменилось,

ПОЧЕМУ?заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 02 декабря 2011

Функция сравнения получает указатель на 2 элемента, которые нужно сравнить.Поскольку ваши элементы являются указателями, функция сравнения должна обрабатывать указатель на указатели.

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 );
}
3 голосов
/ 02 декабря 2011

qsort передает compare адрес (не значение) каждого элемента массива, то есть передает указатель на указатель на ptnode.Вам необходимо изменить первую строку compare на:

ptnode * ia = *(ptnode**)a;

и аналогично для второй строки.

...