struct-pointer array mit qsort sortieren



  • hallo!

    ich habe folgendes problem, dass ich ein array bestehen aus lauter struct-pointern mittels qsort sortieren muss.

    meine struct sieht so aus:

    typedef struct coords{
            double x;              // x Koordinate
            double y;              // y Koordinate
            int position;          // Zeile in der Textdatei
          } COORDS;
    

    dann hab ich mir ein struct-pointer array angelegt:

    COORDS *feld[10];
    

    der qsort aufruf sieht so aus:

    qsort(feld, 10, sizeof(COORDS *), vgl);
    

    bis daher glaub ich ist noch alles in ordnung. das hauptproblem liegt in der vgl - vergleichsfunktion.

    ich poste sie mal:

    int vgl(const void *a, const void *b)
    {
           const COORDS *p1 = (const COORDS *)a;
           const COORDS *p2 = (const COORDS *)b;
           double erg1, erg2, xqad, yqad;
    
           xqad = p1->x*p1->x;
           yqad = p1->y*p1->y;
    

    (nur der auszug, der entscheidend ist!)

    also, das problem liegt darin, dass in p1->x der falsche wert drin steht und zwar 0.000

    weiss jemand von euch, wo der fehler liegt, bzw wie ich das struct-pointer array mit qsort sortieren kann (es muss qsort sein!)
    oder übergebe ich schon das feld dem qsort falsch?

    vielen dank schon mal!

    mfg,

    phuN



  • Die void* a und b sind ja Zeiger auf die zu vergleichenden Elemente deines Arrays. Von welchem Typ ist ein Element des Arrays? Und von welchem Typ ist dann ein Zeiger auf ein Element des Arrays? 😉



  • also das array besteht aus lauter pointern, die auf eine struct COORDS zeigen.

    also 1 element des arrays zeigt immer auf eine struktur



  • phuN schrieb:

    bis daher glaub ich ist noch alles in ordnung. das hauptproblem liegt in der vgl - vergleichsfunktion.

    ich poste sie mal:

    int vgl(const void *a, const void *b)
    {
           const COORDS *p1 = (const COORDS *)a;
           const COORDS *p2 = (const COORDS *)b;
    

    *a is aber in Wirklichkeit vom Typ COORDS*const* wenn Du qsort auf dein Zeiger-Array loslässt. Die Funktion vgl sollte also in etwa so aussehen:

    int vgl(const void *a, const void *b)
    {
       const COORDS *p1 = *((COORDS*const*)a);
       const COORDS *p2 = *((COORDS*const*)b);
       .....
    

    Was lernen wir daraus? Generisches Programmieren mit "void*" ist einfach Mist, da keine Typsicherheit.



  • Sebastian Pizer schrieb:

    Was lernen wir daraus?

    verwende 'typedefs' und benutze sie in der vergleichsfunktion.
    🙂


Anmelden zum Antworten