2014-02-08 56 views
0

所以我正在使用qsort基於一個int值在我稱爲「key」的結構中對結構數組進行排序。但是,雖然我的數組已被正確填充,但似乎並沒有對我的結構進行排序......未調用qsort比較函數?

似乎qsort從不會調用我的比較函數。函數中打印輸出語句的簡單測試顯示了這一點。我的「測試」從不出現。

對比功能:

int compare (const void *a, const void *b){ 
    struct Record* a_r = (struct Record*)(a); 
    struct Record* b_r = (struct Record*)(b); 

    /*test*/ 
    printf("test"); 

    return (a_r->key - b_r->key); 
} 

我的快速排序呼叫:

qsort(arr, (sizeof(arr)/sizeof(struct Record)), sizeof(struct Record), compare); 

是這個問題與我相比較的功能?或者我沒有傳遞正確的變量?

我的數組聲明:

struct Record *arr = malloc(size->st_size); //where st_size is stat() of input file 

回答

3

sizeof(arr)是指針的大小,ARR定義struct Record *。除以struct Record的大小,這很可能是0.

假設您的文件只包含記錄,並且您正在讀取整個文件,請使用size->st_size/sizeof(struct Record)。或者更好,因爲您可能需要其他地方的記錄數量,在讀取輸入文件並使用該變量後設置一個變量。

+0

Ohmygoodness,是的。哇。我錯過了這一點,我感到很愚蠢。 – katiea

1

您必須通過size->st_size/sizeof(struct Record)而非sizeof(arr)/sizeof(struct Record)因爲sizeof(arr)是一個指針的大小,並通過推斷,sizeof(Record)是等於或大於一個指針的尺寸大(這樣就傳遞0或1元素qsort(),所以qsort()並不需要調用比較器,因爲大小0或1的陣列已經排序。

據推測,size->st_size是固定長度記錄的文件的大小,其中的每一個是一個struct Record,否則,沒有按malloc()」 t很有道理