Forum: Mikrocontroller und Digitale Elektronik Funktion in funktion C


von Wolfgang (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das ist ein Funktionspointer, ein Zeiger auf eine Funktion.

von FGast (Gast)


Lesenswert?

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ß

von P. S. (Gast)


Lesenswert?

FGast schrieb:
> Eine Frage daher, macht der
> Compiler denn dann überhaupt schlankeren Code damit ? (bei funktionen
> über pointern)

Schlankeren Code als was?

von Link zu (Gast)


Lesenswert?

Äh, falsches Forum/falscher Topic?

von Wolfgang (Gast)


Lesenswert?

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

von P. S. (Gast)


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.

von Horst (Gast)


Lesenswert?

dass erst zur laufzeit die funktion bekannt sein muß, die tatsächlich 
ausgeführt wird, noch nicht beim compilieren

von Karl H. (kbuchegg)


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

von Wolfgang (Gast)


Lesenswert?

Klingt logisch!

Danke

LG Wolfi

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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

von Wolfgang (Gast)


Lesenswert?

Nicht schlecht man lernt halt nie aus!

Danke

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
Noch kein Account? Hier anmelden.