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);
} // bynameAber als Fehlermeldung kommt:
Der linke Teil von '->vnzr' muss auf Klasse/Struktur/Union zeigen
Der linke Teil von '->vnzr' muss auf Klasse/Struktur/Union zeigenWas 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 zeigenWie 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 zeigenFä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 besserint 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].vnzrOder 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