und mache gerade eine Übungsaufgabe für Funktionspointer. Ich weiß aber
leider überhaupt keinen Weg oder wie es mit Funktionspointer effizienter
wird. Meine Idee wäre es ja nach Anfangsbuchstaben zu sortieren, jedoch
steht in der Angabe ausdrücklich mit Funktionspointer.
Mein Problem ist: Wieso eigentlich Funktionspointer zum Sortieren? Ich
kann mir das überhaupt nicht vorstellen.
Kann mich wer aufklären?
Gruß
Peter II schrieb:> dann wirst du merken, das man dafür einen funktionszeiger braucht.
Eigentlich ging es mir um das Konzept. Ich will gar nicht wissen wie
qsort funktioniert. Ich will nur eine Idee, damit ich mir überlegen kann
wie ich das selber realisiere
Erko schrieb:> Eigentlich ging es mir um das Konzept. Ich will gar nicht wissen wie> qsort funktioniert. Ich will nur eine Idee, damit ich mir überlegen kann> wie ich das selber realisiere
musst du auch nicht. Verwende doch erst mal qsort. Wenn das funktioniert
kannst du dein eigenes qsort schreiben.
Peter II schrieb:> musst du auch nicht. Verwende doch erst mal qsort. Wenn das funktioniert> kannst du dein eigenes qsort schreiben.
Ok, aber ich verstehe nicht ganz, wie qsort funktioniert?
In der Anleitung (hier:
http://www.cplusplus.com/reference/cstdlib/qsort/ ) ist das Beispiel
etwas wirr.
Welche Compare Funktion soll ich zB der FUnktion qsort geben? Im
Beispiel steht das hier:
1
intcompare(constvoid*a,constvoid*b)
2
{
3
return(*(int*)a-*(int*)b);
4
}
Erstens: Ich verstehe nicht was sich dieser Rückgabewert eigentlich
bringt (was er ergibt weiß ich)
Zweitens, ich habe andere Quellen im Internet, die andere Compares
haben. Aber heh?? Wie soll das alles funktionieren?
Erko schrieb:> Aber heh?? Wie soll das alles funktionieren?
genau das ist ja der punkt. Es wird mit funktionspointern gearbeitet.
Der Qsort Funktion muss man einen Funktion mitgeben, die den Vergleich
von 2 Einträgen macht. Sonst könnte Qsort ja nicht beliebige Dinge
sortieren.
Erko schrieb:> Welche Compare Funktion soll ich zB der FUnktion qsort geben?
Na eine, die zwei Strings nach den von dir gewünschten Sortierkriterien
vergleicht.
> Im Beispiel steht das hier:> int compare (const void * a, const void * b)> {> return ( *(int*)a - *(int*)b );> }> Erstens: Ich verstehe nicht was sich dieser Rückgabewert eigentlich> bringt (was er ergibt weiß ich)
Er ist das Vergleichsergebnis, das von qsort benutzt wird, um zu
entscheiden, ob zwei Elemente vertauscht werden sollen oder nicht.
Ein Rückgabewert >0 heißt, daß dein verlgeich den ersten Wert als
"größer" als den zweiten Wert betrachtet, <0 heißt, daß der erste Wert
kleiner ist. Wenn sie beide gleich sind, muß 0 rauskommen.
Vielleicht ist folgende für qsort äquivalente Variante besser
verständlich:
1
intcompare(constvoid*a,constvoid*b)
2
{
3
constint*Wert1=(constint*)a;
4
constint*Wert2=(constint*)b;
5
6
if(*Wert1<*Wert2)
7
return-1;
8
elseif(*Wert1>*Wert2)
9
return1;
10
else
11
return0;
12
}
> Zweitens, ich habe andere Quellen im Internet, die andere Compares> haben.
Na wenn man immer die selbe bräuchte, wäre das ganze ja recht sinnlos.
> Aber heh?? Wie soll das alles funktionieren?
Das ist eine etwas allgemein formulierte Frage.
Joachim Drechsel schrieb:> Herrlich :-)))
Braucht etwas Geduld, man muss bloss die Taktfrequenz erhöhen. Dennoch
ist es gut veranschaulicht.
Grüsse,
René
Ich bringe es irgendwie nicht zusammen, es ist weniger das was mich in
der compare FUnktion beruhigt, sondern eher das wasbeim Aufruf ist. Ich
kriege 1 Warnung, die ich nicht wirklich für verständlich halte
1
#include<stdio.h>
2
#include<stdlib.h>
3
4
voidprintStringTable(char**store);
5
intcompare(char*string1,char*string2);
6
7
intmain()
8
{
9
char**stringtabelle=malloc(4*sizeof(char*));
10
*stringtabelle="Karku";
11
*(stringtabelle+1)="Marku";
12
*(stringtabelle+2)="Parku";
13
*(stringtabelle+3)="Farku";
14
15
printStringTable(stringtabelle);
16
17
qsort(stringtabelle[0],4,6,compare);
18
19
return0;
20
}
21
22
intcompare(char*string1,char*string2){
23
return0;
24
}
25
26
voidprintStringTable(char**store){
27
inti;
28
for(i=0;i<4;i++)
29
printf("String[%d] = %s\n",i,*(store+i));
30
}
Außerdem wie soll das denn qsort anstellen die strings zu vertauschen?
Ich sehe das irgendwie noch nicht ganz ein.
Danke für die ganzen Tipps.
Offtopic:
Wollte gerade fragen, ob die schenkelklatschenden Jungs denn auch schon
den Heapsort und den Mergesort implementiert haben, habe aber die
Antwort selber gefunden:
http://www.youtube.com/user/AlgoRythmics/videos
Die Laufzeiten für die einzelnen Algorithmen kann man dem Link ebenfalls
entnehmen. Dabei schneidet der Quicksort schlechter ab, als sein Name
vermuten lässt. Das kann aber auch an dem verwendeten Speichermodell
liegen :)
Der Heapsort liegt wohl noch beim Programmierer, ähm Choreographen.
Ontopic:
Erko schrieb:> qsort(stringtabelle[0], 4, 6, compare);
Das erste Argument ist nicht richtig: qsort erwartet hier das zu
sortierende Array und nicht nur dessen erstes Element.
Das dritte Argument sollte die Größe eines Array-Elements sein. Überlege
dir, welchen Typ die Array-Elemente haben.
Die Compiler-Warnung kommt aber vom letzten Argument: Gemäß Anleitung
der qsort-Funktion muss die compare-Funktion folgendermassen deklariert
sein:
1
intcompare(constvoid*p1,constvoid*p2);
Erko schrieb:> Außerdem wie soll das denn qsort anstellen die strings zu vertauschen?
Wenn die richtigen Argumente übergeben werden, kennt qsort die
Startadresse des Arrays und die Größe jedes Elements. Damit kann die
Funktion auch die Startadresse des i-ten Elements berechnen. Soll das
i-te mit dem j-ten Element vertauscht werden, werden einfach die beiden
Startadressen berechnet und jeweils soviele nachfolgende Bytes
vertauscht, wie die Elemente groß sind. Um zu entscheiden, welche
Elemente zu vertauschen sind, wird die compare-Funktion mit den
Startadressen von jeweils zwei Elementen aufgerufen.
Zusätzlich zu den Funktionspointern lernst du bei dieser Aufgabe sicher
auch noch eine Menge über Datenpointer und Arrays sowie das Umcasten von
Datenpointern.