Funktionszeiger



  • torben schrieb:

    Danke für die schnelle Antwort! Leider kann ich mit "typedef" nichts anfangen. Kannst du nochmal einen Vorschlag machen ohne typedef, auch wenns dadurch unübersichtlicher wird (warum eigentlich, was macht hier das typedef). Ich kann dann vielleicht auch besser die Syntax von Funktionszeigern erkennen.

    Ohne typedef sieht die Funktion so aus:

    double ableitung (double (*f) (double), double x, double h)
    {
        return ((f (x + h) - f (x - h)) / (2 * h));
    }
    

    Das Schlüsselwort typedef definiert einen alternativen Namen für einen Typ. Du findest sie z.B. haufenweise in der WinAPI:

    typedef unsigned long DWORD;
    typedef unsigned short WORD;
    ...
    

    In diesem Falle bedeutet das, daß du Variablen so definieren kannst:

    DWORD myVar;
    

    Die WinAPI nutzt das z.B. für die Kompatibilität zu vorherigen und nachfolgenden Windows-Versionen; so ist DWORD z.B. immer 32 Bit und WORD immer 16 Bit breit.
    Da die Syntax von Funktionszeigern recht kompliziert ist (besonders Methodenzeiger), nutzt man hier bevorzugt typedef, um die komplizierte Deklaration nur einmal machen zu müssen.

    Moritz



  • torben schrieb:

    Also ich vermute, dass man hier vielleicht mit Funktionszeigern arbeiten könnte

    Nein.

    Bye, TGGC (Wähle deine Helden)



  • Danke! Hab das jetzt mal getestet und es funktioniert auch:

    #include <iostream>
    double ableitung (double (*f) (double), double x, double h)
    {
        return ((f (x + h) - f (x - h)) / (2 * h));
    }
    double myfunc(double x)
    {
    double funcval=2*(x*x*x);
    return funcval;
    }
    void main()
    {
    cout<<ableitung(myfunc,2,0.001);      // 24
    int z;cin>>z;
    }
    

    Aber irgendwie kapier ich nicht so ganz warum es so funktioniert. Ich kann nicht genau sagen was es ist. Wenn du dieses Programm hier vielleicht noch kommentieren könntest (vor allem was den Funktionszeiger betrifft), wäre ich sehr dankbar!

    Viele Grüße, Torben



  • [cpp]#include <iostream>
    using namespace std; // hast du vergessen

    double ableitung (double (*f) (double), double x, double h) // hier wird ein Zeiger auf f() als Parameter übergeben
    {
    return ((f (x + h) - f (x - h)) / (2 * h)); // jeder Aufruf von f() ruft die übergebene Funktion auf
    }

    double myfunc(double x)
    {
    /*double funcval=2*(x*x*x);
    return funcval;*/ // Warum einfach, wenn's auch umständlich geht?
    return (2 * x * x * x);
    }

    int main() // void main() ist kein legales C++
    {
    cout << ableitung (myfunc,2,0.001); // der Funktion ableitung() wird die Adresse von myfunc() übergeben, über welche diese myfunc() aufruft
    // wenn du genau wissen willst, was hier passiert, steig mal mit dem Debugger schrittweise durch
    /* int z; cin >> z; */ // Geht auch ohne Variablendeklaration:
    cin.get ();
    return (0); // einen Wert zurückgeben sollte die Funktion natürlich auch
    }[/cpp]

    Moritz



  • Ach, ist doch alles hässlich. Kann man doch auch schöner mit Vererbung lösen! 😎

    Bye, TGGC (Wähle deine Helden)



  • TGGC_work schrieb:

    Ach, ist doch alles hässlich. Kann man doch auch schöner mit Vererbung lösen! 😎

    Mag ja sein, aber Vererbung hatten wir noch nicht in der Vorlesung. Wir sollen an der Aufgabe denk ich mal den Umgang mit Funktionszeigern lernen.

    Vielen Dank an audacia, hast mir gut und schnell geholfen !

    Viele Grüße, Torben



  • torben schrieb:

    Mag ja sein, aber Vererbung hatten wir noch nicht in der Vorlesung. Wir sollen an der Aufgabe denk ich mal den Umgang mit Funktionszeigern lernen.

    Ahso, ja kann sein. Kenn ja Eure Vorlesung nicht! 😎

    (Ist die wirklich über C++?)

    Bye, TGGC (Keine Macht den Dummen)



  • TGGC schrieb:

    (Ist die wirklich über C++?)

    Ich hoffe das war ernst gemeint und du meinst nicht etwa, dass wir da häkeln oder so 🙂
    Also wir haben halt erst diese Woche mit Objektorientierung angefangen. Vorher gings wohl hauptsächlich um reine C Syntax.

    Gruß, Torben



  • torben schrieb:

    TGGC schrieb:

    (Ist die wirklich über C++?)

    Ich hoffe das war ernst gemeint und du meinst nicht etwa, dass wir da häkeln oder so 🙂

    Er meinte wohl eher, dass man in C++ auch ganz gut ohne diese häßlichen Funktionspointer auskommen kann. Das scheint bei den Profs allerdings immer noch nicht angekommen zu sein 😉 .



  • Meine Proffesorin betont öfters, dass wir einiges nur lernen um auch ältere C Syntax interpretieren zu können, da es wohl umfangreiche Bibliotheken gibt in denen noch diese vorkommt.

    Gruß, Torben



  • Walli schrieb:

    Er meinte wohl eher, dass man in C++ auch ganz gut ohne diese häßlichen Funktionspointer auskommen kann.

    Stimmt, in C++ verwendet man Methodenzeiger 🤡


Anmelden zum Antworten