ERLEDIGT
JA
ANTWORTEN
3
ZUGRIFFE
1056
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
  1. #1
    posi90 ist offline Mitglied Gold
    Registriert seit
    Aug 2010
    Beiträge
    152
    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 cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    void f1() {printf("f1\n");}
    void f2() {printf("f2\n");}
     
    void run(void x())
    {
        void (*f)() = &x;
        f();
    }
     
    int main()
    {
        run(f1);
        run(f2);
        getchar();
        return 0;
    }

    Mein Ziel ist es eine beliebige Funktion an eine Klasse zu übergeben, welche dann in einer Schleife ausgeführt wird.

    mfg. Poseidon
     

  2. #2
    ibafluss ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    240
    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 cpp:
    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. #3
    deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.731
    Hi.
    Zitat Zitat von posi90 Beitrag anzeigen
    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.
    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ß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  4. #4
    posi90 ist offline Mitglied Gold
    Registriert seit
    Aug 2010
    Beiträge
    152
    Danke euch beiden, so sieht es auch viel ordentlicher aus.

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

Ähnliche Themen

  1. Problem bei Funktionszeiger!
    Von pat- im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 21.07.11, 12:52
  2. Unverwalteter Funktionszeiger __cdecl
    Von Cromon im Forum .NET Café
    Antworten: 1
    Letzter Beitrag: 21.01.11, 22:44
  3. DLLImport <-> Unverwalteter Funktionszeiger
    Von Cromon im Forum .NET Café
    Antworten: 4
    Letzter Beitrag: 24.11.10, 09:56
  4. Funktionszeiger in eine Map speichern
    Von int0xicated im Forum C/C++
    Antworten: 0
    Letzter Beitrag: 01.05.08, 20:43
  5. Funktionszeiger in array - aber anders!
    Von zoidberger im Forum C/C++
    Antworten: 10
    Letzter Beitrag: 22.04.08, 08:20