2012-08-30 69 views
1

分揀部分:爲什麼這個使用qsort函數的代碼在C中不起作用?

 order = (struct order_s **) calloc(pm->len - q, sizeof(struct order_s*)); 

     for (i = 0; i < window_pos; ++i) { 
       order[i] = (struct order_s *) malloc(sizeof(struct order_s)); 
       order[i]->pos = i; 
       order[i]->good = good[i]; 
     } 
     for (i = window_pos + q; i < pm->len; ++i) 
     { 
       order[i-q] = (struct order_s *) malloc(sizeof(struct order_s)); 
       order[i-q]->pos = i; 
       order[i-q]->good = good[i]; 
     } 
    qsort(order, pm->len - q, sizeof(struct order_s *), compare); 

比較功能:

int compare (const void * a, const void * b) 
{ 
     if ((((const struct order_s *)a)->good - ((const struct order_s *)b)->good) > 0) 
       return 1; 
     else 
       return -1; 
} 

的stucture:

struct order_s { 
    int pos; 
    double good; 
}; 

值:

(gdb) p pm->len 
$35 = 20 
(gdb) p window_pos 
$36 = 1 
(gdb) p q 
$37 = 5 

的qsort()之前:

(gdb) p *order[0] 
$2 = {pos = 0, good = 1.3238653863672125} 
(gdb) p *order[1] 
$3 = {pos = 6, good = 0.96180564211148134} 
(gdb) p *order[2] 
$4 = {pos = 7, good = 1.0684181637005736} 
(gdb) p *order[3] 
$5 = {pos = 8, good = 0.92113662370476379} 

的qsort()之後:

(gdb) n 
(gdb) p *order[0] 
$6 = {pos = 0, good = 1.3238653863672125} 
(gdb) p *order[1] 
$7 = {pos = 6, good = 0.96180564211148134} 
(gdb) p *order[2] 
$8 = {pos = 7, good = 1.0684181637005736} 
(gdb) p *order[3] 
$9 = {pos = 8, good = 0.92113662370476379} 

qsort功能後,結構的陣列是未排序的正確的並拋出的段故障以後。

+0

那麼_does_它呢?如果你在「比較」內部進行分解,這些值看起來是否合理? – Useless

回答

2

compare()函數參數是指針到數組的元素。在這種情況下,數組的元素是struct order*,這意味着compare()的參數是struct order**,而不是struct order*

更改爲:

int compare (const void * a, const void * b) 
{ 
    const struct order_s** aa = a; 
    const struct order_s** bb = b; 

    /* Can two 'order_s' instances never be equal ? */ 
    if ((*aa)->good - (*bb)->good) > 0) return 1; 
    else return -1; 
} 

從C99標準部7.20.5.2的qsort函數

陣列的內容被根據比較 函數按升序排列通過比較指出,用兩個參數調用,這兩個參數指向要比較的對象 。如果第一個參數分別小於,等於或大於第二個參數,則函數應返回小於,等於或大於零的整數。

+0

這有效。謝謝。 –

+1

我認爲compare()仍然有問題,因爲它從不返回0.可以想象(儘管不太可能)qsort可以用指向同一對象的指針調用比較器。如果它沒有得到0,你會有一段糟糕的時間。 –

相關問題