Frage zu C-Deklaration



  • Moin,

    ich habe gerade in einem Buch über die C++-Programmieren folgendes
    Konstrukt gefunden:

    int *(*f(int))(int, int);
    

    Kann mir jmd. erklären, wie diese Funktion aufgerufen werden würde?
    [Anmerkung: Ich kann C/C++-Programmieren, wobei Zeiger nie zu meinen
    Lieblingsgebiet gehört haben]

    -Kosekans




  • Mod

    Kosekans schrieb:

    Kann mir jmd. erklären, wie diese Funktion aufgerufen werden würde?

    Das ist einfach: f(5) oder vergleichbares.

    Wolltest du vielleicht was anderes fragen, zum Beispiel, was diese Deklaration bedeutet? Ich bin mal so frei, anzunehmen, dass dies die wahre Frage war und beantworte sie. Da steht in Worten ausgedrückt:
    Deklariere f als Funktion (int), mit der Rückgabe eines Zeigers auf eine Funktion (int, int), mit der Rückgabe eines Zeigers auf int.

    PS: Auch wenn dieses spezielle Konstrukt in C und C++ funktionieren würde, bin ich doch etwas erschrocken, dass für dich die beiden Sprachen irgendwie das gleiche zu sein scheinen. Es sind aber zwei ganz verschiedene Sprachen, bloß mit ähnlicher Grammatik! (Und der hier gezeigte Code ist fast reine Grammatik, deshalb würde er in beiden Sprachen gültig sein)



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum Rund um die Programmierung in das Forum C (alle ISO-Standards) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Danke für die beiden Antworten;

    SeppJ schrieb:

    PS: Auch wenn dieses spezielle Konstrukt in C und C++ funktionieren würde, bin ich doch etwas erschrocken, dass für dich die beiden Sprachen irgendwie das gleiche zu sein scheinen. Es sind aber zwei ganz verschiedene Sprachen, bloß mit ähnlicher Grammatik! (Und der hier gezeigte Code ist fast reine Grammatik, deshalb würde er in beiden Sprachen gültig sein)

    Das ist mir schon klar, dumm bin ich nicht 😉
    Sollte es bei mir klingen als wäre beides das gleiche, dann liegt es daran das man in diesem Kontext zwischen C und C++ keinen (merklichen) unterschied hat.

    -Kosekans



  • [quote="SeppJ
    Deklariere f als Funktion (int), mit der Rückgabe eines Zeigers auf eine Funktion (int, int), mit der Rückgabe eines Zeigers auf int.[/quote]

    kurze Frage, auf welche Funktion wird da verwiesen (int,int)?



  • Bub schrieb:

    kurze Frage, auf welche Funktion wird da verwiesen (int,int)?

    Das ist von der Deklaration aus nicht ersichtlich. In der Definition muss ein Rückgabewert angegeben werden, welcher aber auch null sein kann. Jedenfalls ist der Rückgabetyp int* (*)(int, int) .


  • Mod

    Bub schrieb:

    SeppJ schrieb:

    Deklariere f als Funktion (int), mit der Rückgabe eines Zeigers auf eine Funktion (int, int), mit der Rückgabe eines Zeigers auf int.

    kurze Frage, auf welche Funktion wird da verwiesen (int,int)?

    Das ist wie die Frage danach, welcher int bei

    int foo();
    

    zurück gegeben wird.



  • SeppJ schrieb:

    Bub schrieb:

    SeppJ schrieb:

    Deklariere f als Funktion (int), mit der Rückgabe eines Zeigers auf eine Funktion (int, int), mit der Rückgabe eines Zeigers auf int.

    kurze Frage, auf welche Funktion wird da verwiesen (int,int)?

    Das ist wie die Frage danach, welcher int bei

    int foo();
    

    zurück gegeben wird.

    ehrlich gesagt versteh ich es immernoch nicht 🙄

    int foo() ist klar, der Rückgabewert von foo ist int, kann aber auch je nach Deklaration Zeiger auf int oder was anderes sein. Nur der Teil "mit der Rückgabe eines Zeigers auf eine Funktion (int, int)" damit tu ich mich schwer, vor allen Dingen, weil du als Funktionsaufruf f(5) nur angegeben hast, ich hätte jetzt vermutet es muss eine Funktion als Argument benutzt werden.
    Ich habe solche Funktionsaufrufe noch nie benutzt bzw. gesehen.


  • Mod

    Der Rückgabewert ist ein Zeiger. Einer, der auf eine Funktion zeigt. Was ist für dich da dran so groß anders, als ein Zeiger, der auf einen int zeigt?

    Nur der Teil "mit der Rückgabe eines Zeigers auf eine Funktion (int, int)" damit tu ich mich schwer, vor allen Dingen, weil du als Funktionsaufruf f(5) nur angegeben hast,

    Den Rückgabewert habe ich nicht weiter verwendet. Man könnte zum Beispiel so etwas machen, wenn man den Rückgabewert benutzen möchte:

    int *(*foo)(int , int );  // Definiere foo als einen Zeiger auf eine Funktion mit den Argumenten (int, int) und dem Rückgabetyp int*.
    
    foo = f(5);  // Rufe f auf mit einem int als Argument und weise den Rückgabewert foo zu.
    
    int *bar;   // Definiere bar als einen Zeiger auf int.
    
    bar = foo(1,2);   // Rufe die Funktion, auf die f zeigt mit den Argumenten 1 und 2 auf und weise das Ergebnis bar zu.
    
    bar = (*foo)(1,2);  // Genau das gleiche wie oben. Bei Funktionszeigern hat man die Wahl, welche Syntax man nutzen möchte.
    
    printf("%d", *bar);  // Mache etwas mit dem int, auf den bar zeigt.
    
    printf("%d", *f(5)(1,2));  // Oder einfach alles in einem, ganz ohne Zwischenergebnisse.
    

    ich hätte jetzt vermutet es muss eine Funktion als Argument benutzt werden.

    Das Argument hat doch mit dem Rückgabewert absolut gar nichts zu tun. Das Argument ist hier ein int.

    Ich habe solche Funktionsaufrufe noch nie benutzt bzw. gesehen.

    Dann guck dir doch mal an, was Funktionszeiger sind. Ist nicht schwierig, bloß kryptisch.



  • Dank dir, ist schon etwas klarer, ich lese mich dann mal in Funktionspointer ein.


Anmelden zum Antworten