Eine Funktion als Parameter angeben



  • Hallo Community
    kann ich eigentlich eine Funktion als Parameter einer anderen Funktion angeben?
    Müsste doch im Grunde irgendwie funktionieren, immerhin hat sie ja auch eine Adresse im Code Segment. Diese Adresse könnte ich doch als Parameter mit angeben.
    Doch wie mach ich das, denn das müsste ich doch dann auch bei der deklaration mit angeben???

    Beispiel:

    void TargetFunc();          //Diese Funktion soll ausgeführt werden
    void CallFunc(void *Func());
    
    int main(){
        CallFunc(&TargetFunc());
        return 0;
    }
    
    void TargetFunc(){
        cout << "Hallo" << endl;
    }
    
    void CallFunc(void *Func()){
        Func();
    }
    

    Es soll jetzt hier auch erstmal nicht um den Sinn gehen, sondern nur ob es möglich ist



  • CallFunc(TargetFunc);



  • seux schrieb:

    kann ich eigentlich eine Funktion als Parameter einer anderen Funktion angeben?

    Da hast du mehrere Möglichkeiten:
    a) Funktionszeiger
    b) Funktoren (Funktionsobjekte)

    Letztere sind eher der C++ Weg, wenn du später auch Methoden verwenden willst. Für letztere ist der TR1 (sofern vom Compiler unterstützt) oder Boost sehr interessant (std::tr1::function / boost::function vor allem in Kombination mit std::tr1::bind / boost::bind).

    cu André



  • Ja, das ist möglich. Hier mal ein kleines Beispiel:

    #include <iostream>
    #include <string>
    
    void TargetFunc();
    void OtherFunc();
    void ErrorFunc();
    void CallFunc(void (*Func) (void));
    
    int main()
    {
    	void (*myFunc) (void) = NULL;
    
    	int num;
    
    	while (true)
    	{
    		std::cout << "Welche Funktion wollen Sie aufrufen?\nEingabe: ";
    		std::cin >> num;
    
    		switch (num)
    		{
    			case 0:
    				myFunc = TargetFunc;
    				break;
    			case 1:
    				myFunc = OtherFunc;
    				break;
    			default:
    				myFunc = ErrorFunc;
    				break;
    		}
    
    		CallFunc(myFunc);
    
    		std::cout << std::endl;
    	}
    
        return 0;
    }
    
    void TargetFunc()
    {
    	std::cout << "Hallo" << std::endl;
    }
    
    void OtherFunc()
    {
    	std::cout << "Other..." << std::endl;
    }
    
    void ErrorFunc()
    {
    	std::cout << "Error!!!" << std::endl;
    }
    
    void CallFunc(void (*Func) (void))
    {
    	Func();
    }
    

    Weitere findest du auch hier: http://tutorial.schornboeck.net/funkt_zeiger.htm

    Oder einfach bei Google nach "Funktionszeiger" suchen.



  • Jo danke das ging aber schnell 🙂

    @Shader Of Mine: Danke, funktioniert aber nur, wenn in der Deklaration der Funktionsparameter nicht als Zeiger angegeben ist.

    @asc: ich werd das mit dem TR1 gleich mal ausprobieren. Ich verwende GNU GCC und da weiß ih nicht, ob der das unterstützt, werd gleich mal google fragen


Log in to reply