Pionter auf Funktionen

Gast #5041584
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.