我有一個關於qsort的問題。qsort問題() - 排序不正確(C)
這有點奇怪,但我的qsort函數並沒有給我正確的輸出。奇怪的是,我的一些比較函數與我過去的項目相同,但他們根本沒有給我正確的輸入。我不知道如何測試它。
例如:
int comp_name_asc(const void *a, const void *b)
{
const Rec *prec1 = (const Rec *) a;
const Rec *prec2 = (const Rec *) b;
return strcmp(prec1->name, prec2->name);
}
int comp_name_desc(const void *a, const void *b)
{
const Rec *prec1 = (const Rec *) a;
const Rec *prec2 = (const Rec *) b;
return strcmp(prec2->name, prec1->name);
}
第二功能應當降序排列,但結果是相同的:它總是按升序排列。我已經檢查過以確保在正確的時間輸入正確的功能。 Rec是我製作的結構的一個typedef,它有一個char * name參數。
另外(修改以避免溢出):
結果是完全怪異,不上升或下降(即:500,515,100,200 ...)。 byteSize是做得到off_t類型:
char *path; // Build the path
struct stat sb;
if (lstat(path, &sb) == 0) {
// Read sb.st_size
我真的不知道如何調試這一點。我所知道的是,輸入了適當的比較函數,以及一些類似的比較函數在過去使用。
任何想法或如何我可以調試這是值得歡迎的。謝謝。
編輯:
添加調用的qsort:(每次一個元素被添加到陣列中,索引遞增)
int index = 0;
Rec **array = (Rec **) malloc(sizeof(Rec *) * capacity);
// Adds element to the array...
qsort(array, index, sizeof(Rec *), comp_name_desc);
感謝。
編輯:
將溶液下面給出了。謝謝!
我不得不改變:
const Rec *prec1 = (const Rec *) a;
到
const Rec *prec1 = *(const Rec **) a;
,因爲我是如何定義我的數組。謝謝!
歡迎SO。對我來說+1是一個很好的書面問題和格式良好的代碼。 – Arun 2010-10-11 06:19:45
你可以顯示你調用qsort()的代碼嗎?在「升序」的情況下,記錄是按名稱排序的? – psmears 2010-10-11 06:20:54
順便說一句,在比較函數中使用減法並不是一個好主意:在整數溢出的情況下,你會得到不一致的比較結果。 – zvrba 2010-10-11 06:24:18