Funktion als Parameter

Tutorials.at
Verfügbare Informationen zu "Funktion als Parameter"

  • Qualität des Beitrags: 0 Sterne
  • Beteiligte Poster: Dirty Oerty - wirthi - DrPhil_Guth
  • Forum: Tutorials.at
  • Forenbeschreibung: Programmierforum
  • aus dem Unterforum: C / C++
  • Antworten: 4
  • Forum gestartet am: Mittwoch 19.04.2006
  • Sprache: deutsch
  • Link zum Originaltopic: Funktion als Parameter
  • Letzte Antwort: vor 16 Jahren, 2 Monaten, 4 Tagen, 9 Stunden, 56 Minuten
  • Alle Beiträge und Antworten zu "Funktion als Parameter"

    Re: Funktion als Parameter

    Dirty Oerty - 11.02.2008, 14:41

    Funktion als Parameter
    Tag.

    Wollte mal fragen, bzw es würde mich interessieren, ob es möglich ist, einer Funktion als Parameter eine andere Funktion zu übergeben.

    Zum Beispiel also so:

    Code:
    int CageFunction ( int RunFunction( int param1, int param2) )
    {
        //Wichtige Sachen;vor der Ausführung der Funktion zu erledigen
        //...
        int returnvalue = RunFunction(param1,param2);
        //Auch was ganz wichtiges...
        return returnvalue;
    }


    So dass man die Funktion z.b. so aufrufen kann:

    Code:
    int main()
    {
        //...
        retval = CageFunction(add(1,2));
        //...
    }


    Ich will einer Funktion sozusagen den Funktionspointer auf eine andere Funktion übergeben.

    Ist das irgendwie möglich?
    Oder fallen euch Lösungsansätze ein?

    Anzuwenden wäre das z.b. bei der Kernelprogrammierung.
    Zum Sichern der CPU Register vor der Ausführung einer Funktion.

    Mir ist klar, dass das auch anders geht.

    Aber so wie oben gezeigt wäre idealst.

    MfG
    Daniel



    Re: Funktion als Parameter

    wirthi - 11.02.2008, 17:47


    Du weißt ja die antwort eh schon ("Funktionszeiger" oder "function pointer"), warum fragst du eigentlich noch ;-)

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



    Re: Funktion als Parameter

    DrPhil_Guth - 11.02.2008, 17:54


    Ja, das funktioniert. Das ganze nennt sich function pointer. (Funktionszeiger)

    Die syntax ist ein wenig seltsam, deswegen kann ich sie mir nicht merken. Aber google sagt folgendes:
    (http://www.newty.de/fpt/fpt.html)

    Code: /* Deklaration */
    int (*func_ptr) (int, int);

    /* initialisierung */
    func_ptr = add;

    /* Verwendung */
    a = func_ptr(1, 2);

    In deinem zusammenhang, also wenn man einen Funktionszeiger an eine Funktion übergibt würde das so aussehen (denke ich...):

    Zitat: int apply_func(int (*func_ptr) (int, int), int arg1, int arg2)
    {
    return func_ptr(arg1, arg2);
    }

    int main()
    {
    ...
    a = apply_func(add, 1, 2);
    ...
    }

    So, da ich allerdings eher in der C++ ecke zuhause bin, sag ich dir: Es gibt was viieeeel cooleres als Funktionszeiger! Das ganze nennt sich Funktionsobjekt oder auch Funktor.
    Was ist es? Einfach eine Klasse die den Klammer- operator überladt.

    Code: #include <iostream>

    using namespace std;

    // eine Klasse die als Funktionsobjekt dient
    class adder
    {
    public:
       int operator () (int a, int b)
       {
          return a + b;
       }

    private:
       //Hier koennten daten stehen, die das Funktionsobjekt benutzen wuerde
       // int some_data;

    } add; // Deklaration des objekts


    // Eine Templatefunktion das Funktionsobjekt func aufruft
    template <typename FuncType> // Bestimmt den Typ des Funktionsobjekts
    int caller (FuncType func, int arg1, int arg2)
    {
       return func(arg1, arg2);
    }

    // Eine gewoehnliche funktion
    int sub (int arg1, int arg2)
    {
       return arg1 - arg2;
    }


    int main()
    {
       int a = 2, b = 3;

       // funktioniert mit Funktionsobjekt (FuncType == adder)
       cout<<"caller(add, a, b) = "<<caller(add, a, b)<<endl;

       // aber auch mit normalem funktionszeiger
       // (FuncType == int (*) (int, int)
       cout<<"caller(sub, a, b) = "<<caller(sub, a, b)<<endl;

       return 0;
       
    }

    Was hat das für einen Vorteil? Nun ja, erstens es ist schon mal kein Zeiger (-: Zeiger sind immer was gefährliches, da sie immer mit realem Speicher zu tun haben. Wenn es die situation zulässt sollte man sie meiden.
    Zweitens: Du kannst in deinem Objekt noch weitere daten kapseln, zum beispiel zusätzliche Parameter. Oder du kannst dem Objekt weitere funktionen hinzufügen, die dann intern aufgerufen werden. Dann bleiben alle deine Funktionen dort wo sie gebraucht werden. Sie müssen auch nicht über statische Variablen kommunizieren.



    Re: Funktion als Parameter

    Dirty Oerty - 13.02.2008, 21:01


    Die Methode mit den Klassen sieht interessant aus.

    Das mit den Funktionszeigern....das wusste ich..also, ich hab das irgendwo mal gehört und auch schon ein-zwei mal verwendet.

    Werd mich mal drüber setzen...

    MfG
    Daniel



    Mit folgendem Code, können Sie den Beitrag ganz bequem auf ihrer Homepage verlinken



    Weitere Beiträge aus dem Forum Tutorials.at

    Linker- Probleme mit gcc - undefined reference to ... - gepostet von DrPhil_Guth am Sonntag 10.12.2006
    C++ Tutorial (by progger) - gepostet von progger am Freitag 25.08.2006
    Mini-Pascal-Programm - gepostet von TSK am Donnerstag 31.05.2007
    ´Frage zu schleife - gepostet von dani93 am Dienstag 20.11.2007
    Eckige Klammern - gepostet von ohio am Freitag 30.06.2006
    Brauche Hilfe - gepostet von Belphegor am Montag 05.03.2007
    Volumenrechner [Erledigt] - gepostet von AQE89 am Sonntag 28.05.2006
    Turbo C Problem! (Umfrage nur nebenbei) - gepostet von ChillerT am Dienstag 06.02.2007



    Ähnliche Beiträge wie "Funktion als Parameter"

    Rückbank - gepostet von Joschi am Sonntag 13.01.2008
    Wege 2008 und Übungen - gepostet von lichtbruecke am Freitag 18.01.2008
    Fußballvideos - gepostet von soize am Montag 22.10.2007
    RL-PICS-THREAD! - gepostet von stardust am Montag 06.02.2006
    Wen interessiert Jedi Academy das Spiel? - gepostet von Mace am Samstag 25.03.2006