Zahlensortierung



  • Hi!

    Habe mich die letzten Wochen in C-Programme eingelesen und stehe nun vor einem Problem, da mir das Buch nicht weiterhelfen kann (ist nämlich ein Beispiel aus dem Buch, welches ich abgetippt habe und es funktioniert nicht, da anscheinend die Zeiger inkompatibel sind...)

    Hier der Code:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    int i;
    static int int_values[5]={3, 5, 2, 8, 6};
    static float float_values[3]={22.2, 33.3, 44.4};
    int int_comp(int *, int *), float_comp(float *, float *);
    
    qsort(int_values, 5, sizeof(int), int_comp);
    qsort(float_values, 3, sizeof(float), float_comp);
    
    printf("Sortierte Zahlen:\n");
    
    for(i=0; i<5; i++)
    printf("%d\n", int_values[i]);
    
    for(i=0; i<3; i++)
    printf("%4.1f\n", float_values[i]);
    
    getch();
    }
    
    int_comp(int *a, int *b)
    {
    return (*a - *b);
    }
    
    float_comp(float *a, float *b)
    {
    int result;
    
    if (*a==*b) result=0;
    else if (*a>*b) result=1;
    else result=-1;
    
    return(result);
    }
    

    Das Programm soll eigentlich die Zahlen sortiert ausgeben...
    Was stimmt da nicht?

    MfG



  • Sieh dir nochmal ganz genau den verlangten Funktionskopf für die compare- funktion an.

    Sie soll konstante Pointer auf void übernehmen.
    Das Typcasting der Pointer gehört dann in die Vergleichs-Funktion.
    Also ändere sie um in:

    int int_comp(const void*,const void*);
    int float_comp(const void*,const void*);
    
    int int_comp(const void *a,const void *b) 
    { 
      const int* p_a = (int*)a, *p_b = (int*)b; 
      return (*p_a - *p_b); 
    }
    

    Außerdem solltest du die Funktionprototypen außerhalb von main deklarieren.
    Ich würde auch beim QSortaufruf dem Vergleichsfunktion ein & vorranstellen,
    da man ja eine Adresse übergibt. Aber das ist Geschmackssache.

    Viele solche Fehler bemerkt man, wenn man C Code in einem C++ Compiler kompiliert.


Anmelden zum Antworten