2016-04-17 11 views
1

Kann mir bitte jemand sagen, was ist mit dem folgenden Beispiel falsch? Ich nahm es von here und ersetzte int durch unsigned long. Ich änderte auch die , um richtig zu handhaben unsigned long. HierC: qsort scheint nicht mit unsigned lang zu arbeiten

#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); 
} 

ist die Ausgabe Ich habe:

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

Sind Sie nicht, dass die Vergleichsfunktion von Ihnen testen zu gehen? –

+0

Knall! Genau da :) –

Antwort

6

Sie Vergleichsfunktion ist nicht korrekt. Eine Subtraktion von vorzeichenlosen Werten kann den Wert umbrechen, was zu einem falschen Ergebnis führt.

sollte die Funktion vergleicht nur die Werte:

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 Danke für die int-> lange Korrektur. Wie denkst du über das Platzieren eines Semikolons? :-) – 2501

+0

Nicht scharf auf sie auch nicht. Ich habe ein Skript, das über diese Berichte berichtet, und die Lösung ist einfach. –

+0

@ JonathanLeffler Glauben Sie nicht, dass, da das Semikolon am wenigsten stark bindet, es von der Anweisung getrennt werden sollte, wie zum Beispiel die Zuweisung '=' operator. Fast jeder stimmt zu, dass ein Raum davor und danach liegen sollte. 'int a = 5;' vs 'int a = 5;'. Aus einer sprachanognistischen Perspektive scheint in der ersten das Semikolon mit der Zahl zu binden. – 2501

Verwandte Themen