2015-12-09 88 views
0

我已經定義結構排序結構的數組

typedef struct sorting { 
    int number 
} SRT; 

SRT *mystr = NULL; 

這是我後來動態分配的陣列。 我想按number int整理它;

我必須寫什麼樣的函數才能讓qsort去做?我寫道:

qsort(mystr,array_index,sizeof(mystr),magic); 

int magic(const void *a, const void *b) { 
    int one=((const struct mystr*)a)->number; 
    int two((const struct myst*)b)->number; 

    return (one-two); 
} 

但它沒有工作。我該怎麼做? 它拋出了有關未命名類型的錯誤。

+0

如果「不起作用」,請張貼正確的_what_不起作用。在這種情況下,發佈編譯器錯誤會讓問題更容易回答。 – Lundin

+0

另外,它應該是'一 - 二'。 – Lundin

+0

@倫丁:這種草率的比較有微妙的缺陷。看到我的答案。 – chqrlie

回答

2

不能可靠地與功能數組作爲書面排序:

  • 它的語法錯誤,其中一些錯別字,其他人表示類型之間的混淆,結構標籤和變量名稱。

  • return (one - two);只適用於合理的小值onetwo。如果存在整數算術溢出,它將調用未定義的行爲。例如,如果one == INT_MAXtwo == -1,one - two的值不是由C語言指定的,並且在通用平臺上,它可能返回INT_MIN,這是一個負值,導致排序錯誤。

一個簡單的方案是這樣的:

int sort_function(const void *a, const void *b) { 
    int one = ((const SRT*)a)->number; 
    int two = ((const SRT*)b)->number; 

    return (one > two) - (one < two); 
} 

表達(one > two) - (one < two)計算結果爲-1如果one小於two0如果它們相等和1否則。在C中,如果爲false,則比較評估爲0,如果爲true,則比較評估爲1

排序函數應當這樣使用:

qsort(mystr, array_count, sizeof(*mystr), sort_function); 
  • 第二個參數是由mystr指向結構的陣列中的數。
  • 第三個參數是單個結構的大小:sizeof(mystr)是指針的大小,而不是指向的大小。
  • 避免神祕的名字,如magic ...使用類型,函數和變量的描述性名稱。
+0

好的,那很好。 ':)' –

0

兩個問題:

qsort(mystr,array_index,sizeof(mystr),magic); 

mystr是一個指向SRT,讓你在一個指針的大小傳遞到結構,該結構的不大小:

qsort(mystr,array_index,sizeof(STR),magic); 

然後是這樣的:

int one=((const struct mystr*)a)->number; 
int two((const struct myst*)b)->number; 

mystr是一個變量吶我,不是一種類型,並且myst沒有被定義在任何地方。你需要的類型名稱的位置:

int one=((const SRT *)a)->number; 
int two=((const SRT *)b)->number;