PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C: qsort & vergleihsfunktion


bongoplayer
05.01.2002, 20:49
Die Deklaration von qsort könnte z.B. so aussehen, wenn ich in einer Struktur person, die ein char name[30], Adresse, Alter usw. hat,
nach dem Namen sortieren mag:

main(){
person * zeig[ANZ];

qsort(zeig,ANZ,sizeof(person),(int(*) (const void *, const void *))comp); //namen mit qsort sortieren
}

Mein Problem hab ich mit der Vergleichsfunktion comp:
//****************************
int comp(person *p1, person *p2){
int res;
res=strcmp(p1->name,p2->name);
if(res==0)
return 0;
if(res<0)
return -1;
else
return 1;
}
//****************************
Warum muss ich die in qsort nicht mindestens mit comp() rufen? Denn wie werden sonst die Parameter person *p1, person *p2 übergeben?
Wenn ich nämlich in der Funktion comp den Wert von p1 mit printf(&quot;%s\n&quot;, p1->name); ausgeben lasse, kommt irgendein Müll heraus.


Könnt ihr mich da ein bisschen aufklären?


Baegsch
07.01.2002, 18:44
ehm... WTF is qsort? Poste bitte mal den Prototypen der Funktion.

btw. comp() ist leicht sinnlos oder? Zumal es strcmp nur verunstaltet und dir noch weniger infos als strcmp bietet.

inheritsched
07.01.2002, 22:56
bongoplayer: was is denn das ? du vergewaltigst ja praktisch qsort und das restliche Prog *G*

als letzten parameter musste nur die vergleichsfunktion angeben, also comp.
ist schon länger her das ich damit gearbeitet hab, aber bin mir ziemlich sicher das zweites Argument (size) die Größe eines Array-Elements in Bytes angibt, mit deiner angabe nimmst du aber die grösse der gesamten struktur.

poste mal den source

nj0y
11.01.2002, 08:05
Original von bongoplayer
person * zeig[ANZ];

qsort(zeig,ANZ,sizeof(person),(int(*) (const void *, const void *))comp); //namen mit qsort sortieren

Es müßte heißen: sizeof(person *), weil im Speicher nur ANZ mal hintereinander ein Pointer auf einen extra Speicherbereich liegt.

Deine comp-Funktion kann man übrigens in eine Zeile zusammenfassen: return strcmp(p1->name,p2->name);