Strukur mit qsort sortieren



  • Hallo

    ich möchte eine Struktur mit der Funktion qsort sortieren. Ein Array aus int-Werten habe ich schon hinbekommen. Nur wie macht man das mit einer Struktur?

    Ich möchte nach der Variable vnzr sortieren, die ein Datum in der Form 19750318 enthält.

    ich habe das bis jetzt so:

    typedef struct
    {
    char vsgr;
    char byat[3];
    char vnzr[9];
    char resv[12];
    }VARIABEL_STRUCT, * pmyData;

    VARIABEL_STRUCT* variabel = new VARIABEL_STRUCT[izlvar];
    ....Übertrage die Werte ....

    pmyData info;
    qsort(info, izlvar, sizeof(VARIABEL_STRUCT), byname);

    int byname(const void * v1, const void * v2)
    {
    pmyData * data1 = (pmyData *)v1;
    pmyData * data2 = (pmyData *)v2;
    return _tcscmp(data1->vnzr, data2->vnzr);
    } // byname

    Aber als Fehlermeldung kommt:
    Der linke Teil von '->vnzr' muss auf Klasse/Struktur/Union zeigen
    Der linke Teil von '->vnzr' muss auf Klasse/Struktur/Union zeigen

    Was ich auch nicht verstehe: Muss ich die einzelnen Variablen der Struktur selbst vertauschen? Weil _tcscmp vertauscht doch hier nur vnzr? Was ist mit dem Rest der Variablen? Wo/wie muss man die vertauschen? Oder geschieht das automatisch? Findet das Vertauschen in der Funktion "byname" statt? Oder liefert die nur einen int-Wert zurück?

    Fragen über Fragen....

    Hoffentlich kann mir jemand helfen?

    Vielen Dank
    cu
    George



  • sorosch schrieb:

    Muss ich die einzelnen Variablen der Struktur selbst vertauschen?

    Nein das macht qsort.

    Weil _tcscmp vertauscht doch hier nur vnzr?

    Nein _tcscmp vergleicht strings.

    Was ist mit dem Rest der Variablen? Wo/wie muss man die vertauschen? Oder geschieht das automatisch?

    das macht qsort

    Findet das Vertauschen in der Funktion "byname" statt?

    nein

    Oder liefert die nur einen int-Wert zurück?

    Ja.
    In deinem Fall wird die funktion byname von qsort mehrmals aufgerufen. qsort erfährt dadurch die gewünschte sortierreihenfolge.
    Eine selbst geschriebene Vergleichsfuntion muss die gleichen parameter haben wie dein funktion byname und muss < 0 zurückgeben wenn *v1 "kleiner" *v2 ist, 0 wen *v1 "gleich" *v2 ist und >0 wenn *v1 "grösser" *v2 ist
    Kurt



  • Vielen Dank erst mal.

    Aber könntest du mir bitte helfen bzgl. der Funktion byname? Es kommt immer die Fehlermeldung:
    Der linke Teil von '->vnzr' muss auf Klasse/Struktur/Union zeigen

    Wie muss diese Funktion lauten? Wie muss man das mit den Zeigern machen?

    Vielen Dank
    cu
    George



  • sorosch schrieb:

    typedef struct
    {
    [...]}VARIABEL_STRUCT, * pmyData;
    [...]
    **pmyData *** data1 = (pmyData *)v1;

    [...]

    Aber als Fehlermeldung kommt:
    Der linke Teil von '->vnzr' muss auf Klasse/Struktur/Union zeigen
    Der linke Teil von '->vnzr' muss auf Klasse/Struktur/Union zeigen

    Fällt dir was auf?



  • Sorry - aber ich finde den Fehler nicht:((

    pmyData ist doch ein Zeiger auf eine Struktur? Oder doch nicht?

    Die Zeiger machen einem echt kaputt...

    Ist der Zeiger pmyData bei der Struktur schon falsch?

    Vielen Dank
    cu
    George



  • sorosch schrieb:

    pmyData ist doch ein Zeiger auf eine Struktur? Oder doch nicht?

    eben und dann ist

    pmyData * data1
    

    ein zeiger auf einen zeiger auf deine struktur.
    also besser

    int byname(const void * v1, const void * v2) { 
      pmyData data1 = (pmyData )v1; 
      pmyData data2 = (pmyData )v2; 
      return _tcscmp(data1->vnzr, data2->vnzr); 
    }
    

    Kurt



  • Vielen Dank euch beiden.

    Es kommt jetzt zumindest keine Fehlermeldung mehr:))))

    Aber ich habe jetzt noch ein paar Fragen:

    - wird jetzt die ganze Struktur nach vnzr sortiert? Die anderen Variablen werden auch mit "verschoben"? Ich bracuhe mich somit um nichts mehr zu kümmern?

    - Die sortierte Struktur kann ich jetzt wieder ganz normal ansprechen - z.B. so:
    variabel[i].vnzr

    Oder muss ich jetzt mit Zeigern arbeiten, wenn ich die sortierte Struktur haben möchte?

    Vielen Dank
    cu
    George



  • Hallo

    ich habe das jetzt folgendermasen gemacht. Da ich aber noch kein C-Profi bin und mit Zeigern auch noch nicht die Erfahrung habe, traue ich dem ganzen nicht. Getestet habe ich zwar aber vielleicht ist ja trotzdem noch ein Fehler drinnen. Kannst bitte jemand den Code begutachten:

    //Definition der Struktur
    typedef struct
    {
    char vsgr;
    char byat[3];
    char qlgr;
    char wgsvg;
    char vnzr[9];
    }VARIABEL_STRUCT;

    // in izlvar steckt z.B. die Zahl 7
    VARIABEL_STRUCT* variabel = new VARIABEL_STRUCT[izlvar];

    //Befüllen der Array-Struktur
    for (i = 0; i < izlvar; i++)
    {
    variabel[i].vsgr = ptr[h_lng];
    h_lng = h_lng + 1;

    strncpy(variabel[i].byat,ptr+h_lng,2);
    variabel[i].byat[2] = '\0';
    h_lng = h_lng + 2;
    .
    .
    .
    }

    //Jetzt wird sortiert
    qsort(variabel, izlvar, sizeof(VARIABEL_STRUCT), byname);

    //Das ist die Vergleichsfunktion
    int byname(const void * v1, const void * v2)
    {

    VARIABEL_STRUCT *data1 = (VARIABEL_STRUCT *)v1;
    VARIABEL_STRUCT *data2 = (VARIABEL_STRUCT *)v2;

    return strcmp(data1->vnzr, data2->vnzr);

    } // byname

    Vielen Dank nochmal
    cu
    George



  • Hallo

    ich bedanke mich noch recht herzlich für eure Mühe und Hilfe. Es sortiert jetzt so wie ich das haben möchte:)) Zumindest das, was ich getestet habe...

    Nochmals vielen Dank und einen schönen Tag noch
    cu
    George


Anmelden zum Antworten