hallo zusammen,
ich bin Anfängerin und versuche Zeiger auf Funktion zu vestehen.
Ich möchte Zahlen sortieren. Aber erstmals habe ich einne Zeiger auf der
Funktion u8ChoiceBubble definiert, in dieser Funktion möchte ich nur
wissen ob ich eine aufsteigende sortieren machen soll oder nicht.
Mein Problem: Ich möchte gern wissen, ob ich der Rückgabewert auf die
Funktion u8ChoiceBubble(char *pArray) überprüfen kann. Der Wert von
Argument u8ChoiceBubble während der Aufruf der Funktion
vBubblesort(u8ChoiceBubble,cArray, u8LencArray);
Danke sehr
u8ChoiceBubble sollte doch zwei zu vergleichende Elemente bekommen und
entscheiden, welchen größer ist. Ansonsten ist solwas doch nicht so
zweckmässig.
bool u8ChoiceBubble (uint8_t, uint8_t);
Je nachdem, wleche Sortierreihenfolge erreicht werden soll, wird eine
andere Ordnungsrelation mitgegeben.
Du musst dir darüber im klaren werden, wozu du eigentlich eine derartig
indirekt aufgerufene Funktion brauchst, was ihr Zweck ist.
Und darüber bist du dir nicht im klaren.
Ein Sortierverfahren sortiert ein Array anhand eines Sortierkriteriums.
Dieses Kriterium ist es, das du variabel halten willst. Anstatt das der
Sortier-Basisalgorthmus zb eine Abfrage enthält ob a[i] kleiner als
a[i+1] ist (wodurch indirekt das Kriterium 'kleiner' in das
Sortierverfahren eingebaut ist), ruft es eine Funktion auf, die
entscheidet, welche Reihenfolge die richtige ist. Dadurch wird der
Sortieralgorithmus selbst davon befreit.
Zb Bubblesort
umgangssprachlich ausgedrückt, läuft der so ab
nimm an, dass nicht sortiert ist
solange Sortierung nicht hergestellt {
Annahme: Sortierung ist hergestellt
für alle hintereinanderfolgenden Pärchen
wenn sie in der falschen Reihenfolge sind {
vertausche sie
merk dir, dass die Sortierung nicht hergestellt ist
}
}
das einzige, was davon abhängt, ob du aufsteigend oder absteigend
sortieren willst, ist der Schritt "wenn sie in der falschen Reihenfolge
sind". Alles andere ist davon vollkommen unabhängig. D.h. in diesem
Schritt benutzt du einen Funktionspointer auf eine Funktion, deren
Aufgabe es ist, festzustellen, ob die Reihenfolge 2-er Einträge passt,
oder ob sie verändert werden muss.
Lyly schrieb:> Mein Problem: Ich möchte gern wissen, ob ich der Rückgabewert auf die> Funktion u8ChoiceBubble(char *pArray) überprüfen kann.
Falls ich das richtig verstehe, ist die Frage, ob man einen Rückgabewert
der über Pointer aufgerufenen Funktion abfragen kann. Natürlich kann
man, eine Funktion ruft man über Pointer genau so auf wie direkt, nur
mit dem Pointernamen statt direkt dem Funktionsnamen.
Der Test "if (pBubble==0)" prüft dagegen nur, ob der Zeiger selbst
gleich 0 ist.
Lyly schrieb:> ich verstehe gar nicht
Dann bist du mglw. noch nicht soweit, das Potential für Funktionspointer
zu sehen. Warte noch ein wenig. Das Potential von Funktionspointern
erschliesst sich erst, wenn man ein wenig Übung hat.
Hallo,
ich möchte gern die Funktion u8ChoiceBubble benutzen, um zu wissen ob
das Sortieren aufsteigend oder absteingend soll.
In der Funktion vBubblesort werde ich dann abfragen, if(pBubble==0) dann
ein Algorithm für eine aufsteigende Sortierung machen. Wenn nicht für
eine absteingende Sortierung.
Lyly schrieb:> Hallo,> ich möchte gern die Funktion u8ChoiceBubble benutzen, um zu wissen ob> das Sortieren aufsteigend oder absteingend soll.
Wozu soll das gut sein.
Schreib 2 Funktionen, eine die aufsteigend sortiert, eine die absteigend
sortiert. Dann schreibst du dir eine Funktion, die einen zusätzlichen
Parameter nimmt (Art der Sortierung) und entsprechend dessen entweder
die eine Funktion aufruft oder die andere.
Das ist deinem Kentnissstand angemessen. Funktionspointer braucht dazu
niemand. Vor allen Dingen bringt dir ein Funktionspointer an dieser
Stelle so wie du das möchtest, nicht das geringste. Ganz im Gegenteil.
Und solange du das noch nicht siehst, ist es für Funktionspointer für
dich noch zu früh.
Klaus Wachtler schrieb:> Karl Heinz Buchegger schrieb:>> Wozu soll das gut sein.>> Hausaufgabe?
Möglich. Wann genau nimmst du mit deinen Studenten Funktionspointer
durch?
(Mir fehlt es nämlich sowohl bei der Fragestellung, als auch am
präsentierten Code an Substanz, die mich zuversichtlich machen würde,
dass der Fragesteller soweit ist, mit FP umzugehen)
Karl Heinz Buchegger schrieb:> Möglich. Wann genau nimmst du mit deinen Studenten Funktionspointer> durch?
inzwischen gar nicht mehr, aber ansonsten dann, wenn sie bsearch oder
qsort brauchen oder (wenn es Ings sind) bei DGL-Lösern o.ä., also dann
wenn sie es brauchen.
Jedenfalls nicht, bevor sie die einfachen Grundlagen von C verstanden
haben - sonst ist es sinnlos, auch wenn morgen Abgabe wäre :-)
@Lyly: diese ganzen grundlegenden Sachen lernt man am PC wesentlich
besser als an einem Controller. Dadrin ist es dunkel, und du hast keine
Ahnung, was schiefläuft.
Tu dir den Gefallen und lerne erst C, und nimm dann einen Controller in
die Hand.
Ich habe auch eine Frage zu Zeiger auf Funktionen.
Bei einer nicht statischen, lokalen Variable weiß man ja, dass ein
Zeiger da nur dann Sinn hat, wenn die Variable auf dem Heap existiert
und aktiv ist. Nach dem Löschen der Variable wird das Symbol diese
Variabel wahrscheinlich an einer anderen Adresse des Speichers neu
anlegen.
Wie ist es mit Funktionen, können die auch ihre Adresse ändern während
der Programmlaufzeit?
Ich glaube es nicht, weil sie ja entweder global oder statisch sein
können, aber da ich mit Zeigern auf Funktionen arbeite, will ich auf
Nummer sicher gehen.
Ein eigener Fred wäre glaube ich nicht unangebracht.
> Bei einer nicht statischen, lokalen Variable weiß man ja, dass ein> Zeiger da nur dann Sinn hat, wenn die Variable auf dem Heap existiert> und aktiv ist.
..oder auf dem Stack. Oder sonstwo im Speicher.
> Nach dem Löschen der Variable wird das Symbol diese Variabel> wahrscheinlich an einer anderen Adresse des Speichers neu anlegen.
Wie meinen?
> Wie ist es mit Funktionen, können die auch ihre Adresse ändern während> der Programmlaufzeit?
Die Antwort darauf lautet eindeutig 'jein' - eigentich normalerweise
nicht, aber es gibt da halt doch sowas wie dynamisches Linken, und damit
halt doch irgendwie schon.