Boas,
Vou colocar aqui um exemplo de chamar funcoes atraves de apontadores. Tenho 4 exemplos, no qual, o numero 4 nao consigo concretizar. Peco portanto a ajuda da comunidade.
typedef void (*p2Func1)();
class cMyClass
{
public:
int ID;
cMyClass(int val) {
ID = val;
}
void Func2() {
Serial.println("...Func2...");
Serial.println(ID);
}
void (* p2Func3)(void);
void eventFunc3(void(*function)(void)) {
p2Func3 = function;
p2Func3();
}
void (*p2Func4)(cMyClass);
void eventFunc4(void(*function)(cMyClass)) {
p2Func4 = function;
p2Func4(this);
}
};
typedef void (cMyClass::* p2Func2)();
// the setup function runs once when you press reset or power the board
void setup() {
Serial.begin(9600);
Serial.println("TEST1: ----------------");
p2Func1 p1 = Func1;
p1();
Serial.println("TEST2: ----------------");
p2Func2 p2 = &cMyClass::Func2;
cMyClass m2(22);
(m2.*p2)();
Serial.println("TEST3: ----------------");
cMyClass m3(33);
m3.eventFunc3(Func1);
Serial.println("TEST4: ----------------");
cMyClass m4(44);
m4.eventFunc4(Func4);
}
// the loop function runs over and over again until power down or reset
void loop() {
}
void Func1()
{
Serial.println("...Func1...");
}
void Func4(cMyClass *m) {
Serial.println("...Func4...");
Serial.println(m->ID);
}
O resultado "Serial.println(m->ID);" na Func 4 nao é o correcto.
Obrigado.
Func4 tem como parametro um apontador de tipo cMyClass.
Neste pedaço:
m4.eventFunc4(Func4)
Passas a função para o método...
void (*p2Func4)(cMyClass);
Aqui definiste um apontador com tipo cMyClass, não como apontador.
Depois chamas com um apontador:
p2Func4(this);
Corrigindo para isto:
typedef void (*p2Func1)();
class cMyClass
{
public:
int ID;
cMyClass(int val) {
ID = val;
}
void Func2() {
Serial.println("...Func2...");
Serial.println(ID);
}
void (* p2Func3)(void);
void eventFunc3(void(*function)(void)) {
p2Func3 = function;
p2Func3();
}
void (*p2Func4)(cMyClass*);
void eventFunc4(void(*function)(cMyClass*)) {
p2Func4 = function;
p2Func4(this);
}
};
typedef void (cMyClass::* p2Func2)();
// the setup function runs once when you press reset or power the board
void setup() {
Serial.begin(9600);
Serial.println("TEST1: ----------------");
p2Func1 p1 = Func1;
p1();
Serial.println("TEST2: ----------------");
p2Func2 p2 = &cMyClass::Func2;
cMyClass m2(22);
(m2.*p2)();
Serial.println("TEST3: ----------------");
cMyClass m3(33);
m3.eventFunc3(Func1);
Serial.println("TEST4: ----------------");
cMyClass m4(44);
m4.eventFunc4(Func4);
}
// the loop function runs over and over again until power down or reset
void loop() {
}
void Func1()
{
Serial.println("...Func1...");
}
void Func4(cMyClass *m) {
Serial.println("...Func4...");
Serial.println(m->ID);
}
Dá-me este resultado:
TEST1: ----------------
...Func1...
TEST2: ----------------
...Func2...
22
TEST3: ----------------
...Func1...
TEST4: ----------------
...Func4...
44
Era isto que era pretendido??
BRILHANTE!
Muito obrigado ... passei umas boas horas atrás do problema, muito obrigado pela tua solucao.