Hallo! Kann mir bitte jemand erklären was das bewirken soll: funktionsname(variable, (void(*)(unsigned char))funktionsname); Die funktion in den klammern : void test(unsigned char var){....} Vielleicht wär jemand so lieb. LG
Hallo zusammen, ich möchte das Thema auch gerne aufgreifen. Eine Frage daher, macht der Compiler denn dann überhaupt schlankeren Code damit ? (bei funktionen über pointern) Danke und Gruß
FGast schrieb: > Eine Frage daher, macht der > Compiler denn dann überhaupt schlankeren Code damit ? (bei funktionen > über pointern) Schlankeren Code als was?
Danke erstmal! Aber warum dann nicht so: funktionsname(var, funktionsname()); Steh da auf der Leitung die Funktion besitz ja keinen rückgabewert welchen man weiter übergeben könnte. Wird hier einfach die funktion ausgeführt? Was ist der Sinn des ganzen? LG
Wolfgang schrieb: > Steh da auf der Leitung die Funktion besitz ja keinen rückgabewert > welchen man weiter übergeben könnte. > Wird hier einfach die funktion ausgeführt? Was ist der Sinn des ganzen? Es wird ein Zeiger auf eine Funktion uebergeben. Ob und wie oft diese aufgerufen wird, entscheidet die direkt aufgerufene Funktion. Siehe auch: callback function.
dass erst zur laufzeit die funktion bekannt sein muß, die tatsächlich ausgeführt wird, noch nicht beim compilieren
Wolfgang schrieb: > Danke erstmal! > > Aber warum dann nicht so: > > funktionsname(var, funktionsname()); > > Steh da auf der Leitung die Funktion besitz ja keinen rückgabewert > welchen man weiter übergeben könnte. > Wird hier einfach die funktion ausgeführt? Was ist der Sinn des ganzen? Der Sinn das Ganzen ist es eine Funktion in die Lage zu versetzen eine andere Funktion auzurufen, die sie nicht kennt. Denk zb an eine Sortierfunktion. Um zu entscheiden in welcher Reihenfolge 2 Elemente in einem Array sein müssen, muss die Sortierfunktion eine 'Kleiner-Beziehung' auswerten. Da die Sortierfunktion allgemein sein soll, wird diese Aufgabe an eine Funktion delegiert. Wann immer die Sortirefunktion daher wissen will, ob Element A kleiner als Element B ist, ruft sie diese Funktion auf und die sagt es ihr. Aber was ist denn diese Kleiner-Funktion? Die Sortierfunktion kennt sie a priori nicht. Aber sie bekommt einen Pointer auf diese Funktion mitgeliefert und kann über diesen die Funktion aufrufen. Siehe zb auch http://www.mikrocontroller.net/articles/FAQ#Funktionszeiger
Wolfgang schrieb: > Aber warum dann nicht so: > > funktionsname(var, funktionsname()); Weil das die zweite Funktion ausführen würde (durch das Klammerpaar) und den Rückkehrwert übergeben. Es soll aber die Adresse der Funktion selbst übergeben werden. > Steh da auf der Leitung die Funktion besitz ja keinen rückgabewert > welchen man weiter übergeben könnte. Der ist ja dafür auch nicht interessant. > Was ist der Sinn des ganzen? Was der Sinn in deinem Zusammenhang ist, musst du dem Rest deiner Software entnehmen. Eine typische Problemstellung, für die man Funktionszeiger vorteilhaft anwenden kann, ist ein Sortieralgorithmus, bspw. quicksort() aus der C-Standardbibliothek. Dem übergibt man einerseits einen Vektor aus Elementen, die es zu sortieren gibt. Andererseits muss die Implementierung, wenn man sie für beliebige Datentypen benutzen können will, die jeweiligen Elemente miteinander vergleichen können. Damit man das möglichst flexibel machen kann, codiert man den Vergleich nicht in der Sortierfunktion selbst, sondern die Sortierfunktion lässt sich eine Funktion übergeben (in Form eines Funktionszeigers), die sie dann aufrufen kann, um zwei Elemente vergleichen zu lassen. p.s. Karl heinz war schneller...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.