2014-09-28 2 views
0

Я пытаюсь использовать qsort для сортировки массива указателей на координаты x-y на основе их значения y, но q sort не сравнивает правильные значения. Я сбитый с толку в этот момент, может ли кто-нибудь увидеть, что я делаю неправильно?qsort Сравнение всех нулей

функция сортировки:

23 int sortFunc(const void * firsti, const void * secondi){ 
24 
25   const Coordinate* first = firsti; 
26   const Coordinate* second = secondi; 
27 
28   printf("Comparing %f & %f\n", first->y, second->y); 
29   if(first->y < second->y){ return 1;} 
30   else if(first->y == second->y){ return 0; } 
31   else{ return -1; } 
32 
33 } 

функция печати:

13 void printArray(Coordinate * array[], int size){ 
14 
15   int x; 
16   for(x=0; x < size; x++){ 
17     printf("Point %i : %f | %f\n", x, array[x]->x, array[x]->y); 
18   } 
19 
20 } 

и вызова

79  qsort(pointArray, count, sizeof(Coordinate*), sortFunc); 
80  printArray(pointArray, count); 

дает

Comparing 0.000000 & 0.000000 
Comparing 0.000000 & 0.000000 
Comparing 0.000000 & 0.000000 
Comparing 0.000000 & 0.000000 
Comparing 0.000000 & 0.000000 
Comparing 0.000000 & 0.000000 
Comparing 0.000000 & 0.000000 
Point 0 : 103.253334 | -12.472327 
Point 1 : -3.283118 | -3.101071 
Point 2 : 9.289474 | -0.459975 
Point 3 : 14.029107 | -11.844076 
Point 4 : -6.465595 | 14.704790 
Point 5 : -5.764663 | 8.882765 

любая идея, что происходит?

ответ

1

Ваша функция сравнения записывается как, если у вас есть массив Coordinate структур, а не массив указателей в Coordinate структур.

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

int sortFunc(const void * firsti, const void * secondi) 
{ 
    const Coordinate* const* first = firsti; 
    const Coordinate* const* second = secondi; 

    if((*first)->y < (*second)->y){ return 1;} 
    else if((*first)->y == (*second)->y){ return 0; } 
    else{ return -1; } 
} 
+0

yup. Просто получил это. благодаря – Kdawg