www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Funktion in funktion C


Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist ein Funktionspointer, ein Zeiger auf eine Funktion.

Autor: FGast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: P. S. (Gast)
Datum:

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

Schlankeren Code als was?

Autor: Link zu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Äh, falsches Forum/falscher Topic?

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Horst (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klingt logisch!

Danke

LG Wolfi

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nicht schlecht man lernt halt nie aus!

Danke

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.