Hi,
ich brauche kurz mal Eure hilfe.
Ich schreibe gerade eine Methode, der ich eine Methode übergeben will, welche meine Methode bei Bedarf aufrufen soll.
Ähm, mal schnell als Code hingeschmissen, vielleicht macht das deutlicher, was ich meine:
void myMethod(int foo)
{
//Do something
}
void nextMethod(bool DoOrNotToDo, int foo, method callThisMethod)
{
if(DoOrNotToDo)
{
callThisMethod(foo);
}
}
void loop
{
nextMethod(TRUE, 512, myMethod);
}
Das nennt sich Funktionszeiger oder function pointer. In bestimmten Zusammenhängen auch callback:
So, jetzt sollte es passen:
void func1(int value)
{
}
void func2(void (*func)(int), int value)
{
func(value);
}
void loop()
{
func2(func1, 1234);
}
Hi,
ich habe das ganze mal versucht in meine Klasse zu gießen. Ich würde diesen Zeiger gerne in eine andere Varaiable übergeben. Dabei habe ich ein Problem. Mal Auszugsweise:
Header:
#ifndef SimleTimer_H
#define SimpleTimer_H
class SimpleTimer
{
private:
void (*methodToCall);
public:
void Init(void (*call));
void TimerLoop();
}
cpp:
void SimpleTimer::Init(void (*call))
{
methodToCall = call;
}
void SimpleTimer::TimerLoop()
{
methodToCall(); //<<<<FEHLER
}
ich habe an der markierten Stelle folgende Fehlermeldung von der IDE:
"Der Ausdruck vor den Klammern des sichtbaren Aufrufs muss einen Funktionstyp (pointer-to) aufweisen".
Kompilerfehler:
"error: '((SimpleTimer*)this)->SimpleTimer::methodToCall' cannot be used as a function"
Was mache ich den hier falsch?
Der Zeiger und der Funktions-Prototyp sind falsch deklariert
Und auch die Implementierung
void SimpleTimer::Init(void (*call))
Da fehlt die Angabe des Parameters des Zeigers.
Ahhhh... klar.. ich muss ja auch bei einer Parameterlosen Methode die Klammern angeben. Danke für den Hinweis!
Also, das läuft in Visual C++:
void (*funcptr)(void) = NULL;
void init(void (*func)(void))
{
funcptr = func;
}
void func()
{
cout << "func" << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
init(func);
if(funcptr != NULL)
funcptr();
getchar();
}
Du solltest wie da den Zeiger mit NULL initialisieren und dann vor dem Aufruf darauf abfragen. Einen Funktionszeiger aufrufen der NULL führt nämlich zu einem Sprung in den Reset Vektor.
Was vielleicht auch klarer ist, ist diese Syntax beim Aufruf:
(*funcptr)();
Durch das Dereferenzieren sieht man hier sofort dass man hier mit einem Funktionszeiger arbeitet. Ist aber optional.