Pionter auf Funktionen

Gast #5041584
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
#5041588
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.
Gast #5041697
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
}
#5043320
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.

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