1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

[C/C++] Funktionszeiger

Dieses Thema im Forum "C/C++" wurde erstellt von posi90, 24. April 2012.

  1. posi90

    posi90 Erfahrenes Mitglied

    Hallo,

    Ich habe eine Frage bezüglich MVS2010 und Funktionszeiger, und zwar hab ich eine Fehlermeldung vom Syntaxhighlighter: Wert von "void(**)()" kann nicht zum Initialisieren einer Entität vom Typ "void(*)()" verwendet werden.

    Da sich das Programm jedoch compilieren und fehlerfrei ausführen lässt, wollte ich fragen warum dieser Error auftaucht.

    Code (C++):
    1.  
    2. void f1() {printf("f1\n");}
    3. void f2() {printf("f2\n");}
    4.  
    5. void run(void x())
    6. {
    7.     void (*f)() = &x;
    8.     f();
    9. }
    10.  
    11. int main()
    12. {
    13.     run(f1);
    14.     run(f2);
    15.     getchar();
    16.     return 0;
    17. }
    18.  
    Mein Ziel ist es eine beliebige Funktion an eine Klasse zu übergeben, welche dann in einer Schleife ausgeführt wird.

    mfg. Poseidon
  2. ibafluss

    ibafluss Erfahrenes Mitglied

    run() bekommt das x als Parameter. Hier wird eigentlich ein Zeiger auf die Funktion übergeben (ich bin es gewohnt das immer so zu schreiben, so wie du das machst kenne ich das gar nicht):

    Code (C++):
    1. void run(void (*x)())
    Ist aber im Prinzip dasselbe, nur es wird eben ein Zeiger auf die Funktion übergeben, deshalb darfst du in der Funktion kein & vor x setzen, du benötigst ja nicht die Adresse des Zeigers, sondern auf was der Zeiger zeigt (eben die Funktion).

    Lg
  3. deepthroat

    deepthroat Premium-User

    Hi.
    Ganz einfach: die Typen passen nicht zusammen.

    Den Parameter als "void x()" anzugeben ist ziemlich unüblich und nutzt eine selten genutzte Eigenheit des C Standard: bei der Deklaration eines Parameters vom Typ "Funktion mit Rückgabetyp R" wird dieser automatisch in "Zeiger auf Funktion mit Rückgabetyp R" umgewandelt. Deshalb ist der Typ von "&x" in Zeile 6 dann "Zeiger von Zeiger auf Funktion mit Rückgabetyp R".

    Letztlich solltest du einfach die übliche Schreibweise "void (*x)()" verwenden und außerdem kannst du x dann auch einfach aufrufen - ohne den Umweg über f.

    Man sollte solche impliziten Umwandlungen vermeiden. Mach es explizit - auch beim Aufruf: verwende die Schreibweise "run(&f1);" und nicht die automatische Umwandlung einer Funktion in einen Zeiger auf die Funktion.

    Gruß
  4. posi90

    posi90 Erfahrenes Mitglied

    Danke euch beiden, so sieht es auch viel ordentlicher aus.

    Code (C++):
    1.  
    2. void f1() {printf("f1\n");}
    3. void f2() {printf("f2\n");}
    4.  
    5. void run(void (*x)())
    6. {
    7.     x();
    8. }
    9.  
    10. int main()
    11. {
    12.     run(&f1);
    13.     run(&f2);
    14.     getchar();
    15.     return 0;
    16. }
    17.  

Diese Seite empfehlen