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
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.
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.
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.
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 | }
|
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.
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ß
Ein wesentlicher Anwendungsfall sind so genannte Callback-Funktionen. Die an das schon genannte qsort zu übergebende Vergleichsfunktion ist genau das.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.