Funktion in funktion C

Gast #1377755
Lesenswert?

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.
#1377758
Lesenswert?

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
Moderator Persönliche Seite #1377761
Lesenswert?

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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren