2016-04-17 11 views
1

誰でも次の例で何が問題なのか教えてください。私はそれをhereから取り出し、intunsigned longに置き換えました。私もcmpfuncunsigned longを適切に処理するように変更しました。ここでC:qsortが符号なしlongで動作しないようです

#include <stdio.h> 
#include <stdlib.h> 

unsigned long values[] = { 88, 56, 100, 2, 25 }; 

int cmpfunc (const void * a, const void * b) 
{ 
    if(*(unsigned long*)a - *(unsigned long*)b < 0){ 
    return -1; 
    } 

    if(*(unsigned long*)a - *(unsigned long*)b > 0){ 
    return 1; 
    } 

    if(*(unsigned long*)a - *(unsigned long*)b == 0){ 
    return 0; 
    } 
} 

int main() 
{ 
    int n; 

    printf("Before sorting the list is: \n"); 

    for(n = 0 ; n < 5; n++) 
    { 
     printf("%lu ", values[n]); 
    } 

    qsort(values, 5, sizeof(unsigned long), cmpfunc); 

    printf("\nAfter sorting the list is: \n"); 

    for(n = 0 ; n < 5; n++) 
    { 
     printf("%lu ", values[n]); 
    } 

    return(0); 
} 

は、私が得た出力である:

Before sorting the list is: 
88 56 100 2 25 
After sorting the list is: 
25 2 100 56 88 
+2

関数は値を比較する必要がありますか? –

+0

Bang!右そこに:) –

答えて

6

あなた比較関数が正しくありません。符号なしの値を減算すると、不正な結果を与える値がラップされることがあります。あなたはあなたのことを比較機能をテストするつもりはありません

int compare(const void* a , const void* b) 
{ 
    const unsigned long ai = *(const unsigned long*)a; 
    const unsigned long bi = *(const unsigned long*)b; 

    if(ai < bi) 
    { 
     return -1; 
    } 
    else if(ai > bi) 
    { 
     return 1; 
    } 
    else 
    { 
     return 0; 
    } 
} 
+0

@JonathanLeffler int->長い修正ありがとうございました。セミコロンの前にスペースを置くことについてどう思いますか? :-) – 2501

+0

どちらにも熱心ではありません。私はそれらを報告するスクリプトを持っていますが、修正は簡単です。 –

+0

@JonathanLefflerセミコロンは最も強くバインドしないので、たとえば '= '演算子の代入と同じように、ステートメントから分離する必要があるとは思わないでしょうか。ほぼすべての人が、その前後にスペースがあることに同意します。 'int a = 5;' vs 'int a = 5;'。言語にとらわれない視点から見ると、前者ではセミコロンが数字と結びついているようです。 – 2501

関連する問題