2013-04-07 106 views
0

我想使用在C內置qsort函數排序結構比較功能

typedef struct abc{ 
    long long int fir; 
    long long int sec; 
}abc; 

在我用下面的代碼比較功能,這樣,如果變量「杉」是相同的在結構abc數組中的任何兩個元素之間,那麼排序條件將取決於變量「sec」。

long long int cmp(const abc* e1, const abc* e2) 
{ 
if(e1->fir==e2->fir) 
     return e1->sec-e2->sec; 
else 
    return e1->fir-e2->fir; 
} 

該代碼似乎無法正常工作。 做什麼是正確的方法?

+2

確定。這裏有什麼問題? – 2013-04-07 19:53:35

+0

它不起作用?你可以發佈調用代碼,還是一個完整的小程序? – hmjd 2013-04-07 19:56:01

+1

使您的比較函數與qsort指定的簽名匹配將是一個好的開始。它應該是int(* compar)(const void *,const void *)。根據您的平臺以及它如何處理參數和返回值可能無關緊要;那麼它可能會再次。 – 2013-04-07 20:13:41

回答

2
long long int cmp(const abc* e1, const abc* e2) 

沒有qsort比較函數的正確簽名,所以你的程序有未定義的行爲。你應該把你的編譯器警告標誌設置得很高,它會警告你這樣的事情。

只要減法不能溢出,您的實際測試就沒有問題,這很可能不是長久以來的問題。 編輯這裏的減法不正確,因爲cmp的返回值必須是int。減法結果爲long long,所以如果您的值太大,結果太大而無法放入int,qsort肯定會產生錯誤的順序。

更一般地,雖然,這是更準確:

int cmp(const void* v1, const void* v2) 
{ 
    const struct abc* p1 = v1; 
    const struct abc* p2 = v2; 

    if (p1->fir < p2->fir) 
     return -1; 
    else if (p1->fir > p2->fir) 
     return 1; 
    else 
     return p1->sec < p2->sec? -1 : p1->sec > p2->sec? 1 : 0;  
} 
+0

你可以發佈一些代碼,它是正確的實施? – learner 2013-04-07 20:30:50

+0

@learner我做了...看到我的編輯。 – 2013-04-07 20:31:29

+0

我做了一個快速代碼來測試它,但它似乎不工作 - : http://pastebin.com/tM2f7N0P – learner 2013-04-07 20:50:45

0

您正在使用的內置qsort可能需要一個「低於」(運算符<)謂詞,這是C++的正常術語。只要參數不相等,你的情況在兩種情況下都會返回true。

您必須返回真正的IFF(當且僅當)e1<e2

+1

「您正在使用的內置qsort可能需要一個」低於「(運算符<)謂詞」 - 錯誤。 「C++的正常術語」 - 這是標記爲C,而不是C++。 – 2013-04-07 20:15:38

+0

@JimBalter你說得對,我沒有注意到它 - 我的道歉。我已經提出了你的回覆,所以它的第一個,我會讓我留下..也許他會升級到C++有時:) – rmn 2013-04-07 20:35:16

+0

的確。我寫了C 35年,並且在C語言標準委員會工作......今天寫入C是一個嚴重的錯誤,除非它的遺留代碼。人們對初學者教這些東西是可惡的,特別是當有些東西像http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-001-structure-and-interpretation-of -computer-programs-spring-2005/index.htm可用。 – 2013-04-07 20:39:19