Funktionszeiger: Wer kennt diese Syntax?



  • An alle C Freaks...
    kann mir jemand sagen, was folgende Syntax zu bedeuten hat bzw. was dies' bringen soll?

    typedef int peter(int);

    peter func1;
    int func1(int var)
    {
    return 5;
    }

    peter *funcptr = func1;

    void main()
    {
    printf("Wert: %i\n",funcptr(4));
    }

    So das ist der Code! Dieser läßt sich OHNE Warnings und Errors compilieren und ausführen! Aber was bedeutet nun dieser Code?

    Was bedeutet: "typedef int peter(int)" Dies ist wohl kein Funktionszeiger!
    Was bedeutet: "peter func1;" Habe mal irgendwo gelesen, dass dies dem Compiler erlaubt das Funktionsinterface zu überprüfen....kann dies' hier nicht nachvollziehen! Was soll das bringen "peter func1" vor die Funktionsdefinition zu schreiben?

    Dies: "peter *funcptr = func1;" ist einigermaßen klar. Hier wird ein Zeiger auf eine Funktion mit Parameter int und Rückgabewert int definiert.

    Der Rest ist mir klar!
    Habe bereits versucht nach diesem Bsp. zu googeln...ohne Erfolg.
    Hat irgend jemand eine Anhung wie das funktioniert und kann es in einfachen Worten erklären?!?

    Thx a lot for your time!
    HansImGlueck



  • Funktionszeiger wäre:

    typedef int (*fnPeter)(int);
    

    ...
    http://www.newty.de/fpt/index.html



  • peter ist der typ für funktionen, die einen int zurückgeben und einen int als parameter haben.
    peter func1 ist eine deklaration für eine funktion von ebendiesem typ, in der zeile danach wird die funktion dann definiert.

    ersetze in gedanken alles durch einfache variablen, int, dann wird es vielleicht klarer:

    typedef peter int;
    
    peter x;
    //x = 1;
    
    peter *xptr = &x; //implizite konvertierung in zeiger geht nur bei funktionen.
    
    int main () //ach, und verwende int main.
    {
       printf("Wert. %i\n", *xptr);
    }
    

    klarer?



  • Erstmal Danke für Eure Mühe und die Antworten!!

    Die Erklärung von queer_boy hat mich ein Stück näher zum Ziel gebracht! Jedoch ist mir noch folgendes unklar, hier nochmal mein Beispiel:

    typedef int peter(int); 
    
    peter func1; 
    int func1(int var) 
    { 
       return 5; 
    } 
    
    peter *funcptr = func1; 
    
    int main() 
    { 
       printf("Wert: %i\n",funcptr(4));
       return 0; 
    }
    

    Was bringt mir die Zeile 3 bzw. für was ist diese Zeile gut? Oder bringt sie nur dem Compiler was und mir nichts? Hat diese Zeile irgendwelche Vorteile?
    Weil ich könnte ja auch folgendes machen (was wohl gängiger ist!!). Einfach einen Funktionszeiger definieren (Zeile 1). Aber was schenkt sich das zum Beispiel weiter oben?

    typedef int (*peter)(int); 
    
    //peter func1; // Fuehrt zum Compilerfehler...klar weil peter jetzt ein Funktionszeiger ist! 
    int func1(int var) 
    { 
    return 5; 
    } 
    
    peter funcptr = func1; // Und hier den Zeiger weglassen!
    
    int main() 
    { 
        printf("Wert: %i\n",funcptr(4));
        return 0;
    }
    

    Ich könnte auch folgendes Beispiel machen, in dem ich die Zeile 3 vom Beispiel ganz oben auskommentieren. Das Ergebnis ist das Gleiche! Aber für irgendwas muss sie doch gut sein?....:

    typedef int peter(int); 
    
    //peter func1; //Diese Zeile einfach weglassen
    int func1(int var) 
    { 
    return 5; 
    } 
    
    peter *funcptr = func1; 
    
    int main() 
    { 
    printf("Wert: %i\n",funcptr(4)); 
    return 0;
    }
    

    Hoffe, ich habe Euch jetzt nicht ganz verwirrt?! Vielleicht denke ich jetzt auch einfach zu kompliziert oder ich habe es einfach noch nicht ganz verstanden!
    Kann es vielleicht sein, dass dieses Konstrukt "peter func1" vor Funktionen nur dann zum Tragen kommt, wenn C-Dateien und H-Dateien verwendet werden? Quasi die Definitionen im Header und die Deklarationen in der C-Datei? Konnte bis jetzt noch keinen Fehler produzieren, in dem mir "peter func1" etwas gebracht hätte!

    Again...thx a lot for your time and your knowlege!!
    HansImGlueck



  • HansImGlueck schrieb:

    Ich könnte auch folgendes Beispiel machen, in dem ich die Zeile 3 vom Beispiel ganz oben auskommentieren. Das Ergebnis ist das Gleiche! Aber für irgendwas muss sie doch gut sein?....:

    [...]

    Hoffe, ich habe Euch jetzt nicht ganz verwirrt?! Vielleicht denke ich jetzt auch einfach zu kompliziert oder ich habe es einfach noch nicht ganz verstanden!
    Kann es vielleicht sein, dass dieses Konstrukt "peter func1" vor Funktionen nur dann zum Tragen kommt, wenn C-Dateien und H-Dateien verwendet werden? Quasi die Definitionen im Header und die Deklarationen in der C-Datei? Konnte bis jetzt noch keinen Fehler produzieren, in dem mir "peter func1" etwas gebracht hätte!

    Hier:

    typedef int peter(int); 
    
    //peter func1; //Diese Zeile einfach weglassen
    
    peter *funcptr = func1; 
    
    int main() 
    { 
        printf("Wert: %i\n",funcptr(4)); 
        return 0;
    }
    
    int func1(int var) 
    { 
        return 5; 
    }
    

    Ohne "peter func1" erzeugt das natürlich einen Fehler.

    Dein "peter func1" ist nichts anderes als eine Deklaration in ungewöhnlicher Schreibweise. Stattdessen könntest du auch einfach int func1(int); schreiben.



  • Hallo HansImGlueck,

    peter func1;
    

    ist das Synonym für:

    int func1(int);
    

    Du hast Recht. Diese Zeile ist in deinem ursprünglichen Code
    nicht erforderlich, da die Definition der Funktion direkt danach
    kommt.
    Die Zeile ist lediglich eine "Forward"Deklaration einer Funktion.

    Wenn du Funktionen verwenden möchtest, die du aber in der Datei
    nach der ersten Nutzung erst definieren möchtest, kannst du dem
    Kompiler mit so einer "Forward"Deklaration die Funktion schon mal
    bekannt machen, so dass er beim Kompilieren weiß: "die Funktion
    wird später noch definiert"

    Ein Beispiel:

    int f(int a) {
       if (a==1) return 2;
       return g(2);
    }
    
    int g(int a) {
       if (a==2) return 3;
       return f(1);
    }
    

    Dieses Beispiel würde so nicht korrekt kompiliert werden, da der
    Kompiler in der Zeile 3 die Funktion g() nicht kennt.

    Wenn du nun aber eine "Forward"Deklaration der Funktion g() einfügst,
    gibt es keine Probleme:

    int g(int);
    
    int f(int a) {
       if (a==1) return 2;
       return g(2);
    }
    
    int g(int a) {
       if (a==2) return 3;
       return f(1);
    }
    

    Gruß mcr



  • Hallo "mcr",

    Vielen Dank für Deine Antwort! Kann mir auch keinen anderen Sinn vorstellen, als wie Du ihn beschrieben hast!

    ...wieder was dazugelernt!!

    Thx a lot!!
    HansImGlueck


Anmelden zum Antworten