Forum: Mikrocontroller und Digitale Elektronik Pionter auf Funktionen


von Johannes H. (Gast)


Lesenswert?

Hallo Leute,

wie im Betreff auch zu entnehmen ist handelt sich in meine Frage um 
Pointer auf Funktionen.


Wenn ich nicht falsch liege werden Pointer auf Funktionen dann 
verwendet, wenn man über einen Pointer die Adresse der Funktion x der 
Funktion y als Parameter übergibt damit man die Funktion x innerhalb der 
Funktion y aufrufen kann. Liege ich hierbei richtig?

Meine Frage wäre jetzt, ob es in der Praxis oft vorkommt, in denen man 
Funktionspointer verwendet oder ist das nur zwecks der Schönheit?

Lg Johannes

von Peter II (Gast)


Lesenswert?

Johannes H. schrieb:
> Meine Frage wäre jetzt, ob es in der Praxis oft vorkommt, in denen man
> Funktionspointer verwendet oder ist das nur zwecks der Schönheit?

qsort ist ein schönen Beispiel dafür. Es kommt also in der Praxis vor.

von Cyblord -. (cyblord)


Lesenswert?

Johannes H. schrieb:
> Meine Frage wäre jetzt, ob es in der Praxis oft vorkommt, in denen man
> Funktionspointer verwendet oder ist das nur zwecks der Schönheit?

Was für eine Frage. Zwecks welcher Schönheit denn? Natürlich kann das 
oft vorkommen. Man braucht das z.B. für viele Arten von OO Ansätzen.
Aber auch sonst ist es oft praktisch und elegant, eine Reihe von 
Funktionen zu haben, welche man per Funktionspointer "selektiert" und 
der aufrufende gar nicht genau wissen muss, welche konkrete Funktion er 
da aufruft.
Damit werden überhaupt erst "generische" Funktionen, als Vorläufer von 
Templates, möglich.

von Andreas E. (hismastersvoice)


Lesenswert?

Johannes H. schrieb:
> Meine Frage wäre jetzt, ob es in der Praxis oft vorkommt, in denen man
> Funktionspointer verwendet oder ist das nur zwecks der Schönheit?

Callbacks, Threads, Signalhandler, ...
Also mehr eine gängige Methode.

von Achim.S (Gast)


Lesenswert?

Selbst ohne Übergabe an eine Funktion können die Sinnvoll sein:
1
void do_runa(void){blabla;}
2
void do_runb(void){anderes_blabla;}
3
int runa = 1;
4
void doit1(void)
5
{
6
    if(runa) do_runa();
7
    else     do_runb();
8
}
9
10
/* alternativ doit als Funktionspointer: */
11
12
void (*doit)(void) = do_startup;
13
14
/* im Programm wird dann beides gleich verwendet */
15
/* Beim Pointer-Ansatz entfällt die "Gott-Funktion",
16
   die alle möglichen Funktionen für doit kennen muss. 
17
   hier können selbst externe libraries doit richtig setzen.
18
*/
19
20
int main(void)
21
{
22
    for(;;)
23
    {
24
        /* aufruf der Funktion */
25
        doit1();
26
        doit();
27
        ...
28
        /* setzen der dahinterliegenden Funktion */
29
        if(...) 
30
        {
31
            runa = 0;
32
            doit = do_runb;
33
        }
34
        if(...)
35
        { 
36
            runa = 1;
37
            doit = do_runa;
38
        }
39
    }
40
}

von Sven B. (scummos)


Lesenswert?

Oft braucht man das nicht und man sollte sich auch jedes mal überlegen, 
ob man's hier wirklich braucht. Einfach zu lesen ist meist anders. Aber 
dafür ist es zum Beispiel gut, ja.

von Christian S. (roehrenvorheizer)


Lesenswert?

Hallo,

Zeiger auf Funktionen kommen beispielsweise immer dann vor, wenn aus 
einem Menü heraus mehrere mögliche Aktionen/Betriebsarten ausgewählt 
werden sollen.

Mit freundlichem Gruß

von Rolf M. (rmagnus)


Lesenswert?

Ein wesentlicher Anwendungsfall sind so genannte Callback-Funktionen. 
Die an das schon genannte qsort zu übergebende Vergleichsfunktion ist 
genau das.

von Benjamin S. (recycler)


Lesenswert?

In der Treiberprogrammierung wird das oftverwendet.
Du hast z.B. einen generischen Teil, der immer gleich ist. Z.B. ein 
Zugriff auf eine Datei. Was aber darunter für ein Filesystem steckt, 
kannst du im Vorherein nicht sagen, z.B. FAT für USB Sticks, NTFS für 
HDD oder ISO9660 für CDROM.

Weiteres Beispiel wären Modulare Pluginsysteme, z.B. Winamp, wers noch 
kennt.

Also immer wenn man nicht voraus weiß, was ausgeführt werden soll, dann 
nimmt man FP.

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.