Go Down

Topic: Apontador para funcao (Read 431 times) previous topic - next topic

fmonteiro_pt

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.

Code: [Select]

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.

bubulindo

#1
Jul 14, 2020, 06:07 pm Last Edit: Jul 14, 2020, 06:08 pm by bubulindo
Func4 tem como parametro um apontador de tipo cMyClass.

Neste pedaço:
Code: [Select]
m4.eventFunc4(Func4)
Passas a função para o método...

Code: [Select]
void (*p2Func4)(cMyClass);
Aqui definiste um apontador com tipo cMyClass, não como apontador.


Depois chamas com um apontador:

Code: [Select]
p2Func4(this);

Corrigindo para isto:

Code: [Select]


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:

Quote
TEST1: ----------------
...Func1...
TEST2: ----------------
...Func2...
22
TEST3: ----------------
...Func1...
TEST4: ----------------
...Func4...
44
Era isto que era pretendido??
This... is a hobby.

fmonteiro_pt

BRILHANTE!
Muito obrigado ... passei umas boas horas atrás do problema, muito obrigado pela tua solucao.

Go Up