Ponteiros de função Callback C ++ com / sem classes
Eu fiquei preso. Eu estou tentando formar uma função que coma ponteiros de função sem classe e os de objetos. Aqui está o meu código atual que, com sorte, explica mais.
(Ele deve ser executado em um Arduino, portanto não posso usar grandes bibliotecas.)
Primeiro, estou usando esta biblioteca para o Arduino:
/* SimpleTimer - A timer library for Arduino.
* Author: [email protected]
* Copyright (c) 2010 OTTOTECNICA Italy
*/
Que aceita funções que chama em um intervalo de timer definido deste tipo:
typedef void (*timer_callback)(void);
No que diz respeito ao meu conhecimento, é uma função classles, a página da web Ponteiros para funções membro me levou muito longe, mas não longe o suficiente. Provavelmente um déficit de terminologia do meu lad
Agora, criei minha própria classe que, por sua vez, gostaria de usar esta biblioteca SimpleTimer. Mas se eu alimentar o SimpleTimer, minha classe funciona, ele não gosta deles (o que eu entendo). Mas como seria possível fazer isso acontecer sem alterar a biblioteca SimpleTime
Então existe a classe Robot, que temRobot::halt()
. Quero que o robô avance por um determinado período de tempo. Igual a
void Robot::forward(int speed, long time) {
reset();
timer.setTimer(time, c_func, 1);
analogWrite(l_a, speed);
analogWrite(r_a, speed);
isMoving(true);
}
void Robot::halt() {
__isMoving = false;
digitalWrite(r_a, LOW);
digitalWrite(r_b, LOW);
digitalWrite(l_b, LOW);
digitalWrite(l_a, LOW);
}
A variável c_func é uma função sem classe neste momento, mas eu gostaria de usar oRobot::halt
função. Eu olhei, li, aprendi, mas ainda não consegui. Parece que não consigo entender meu porque estou perdendo algum ângul
Eu tentei
timer.setTimer(time, (this->*halt), 1);
timer.setTimer(time, Robot::*halt, 1);
timer.setTimer(time, &Robot::halt), 1);
Mas tudo isso equivaleria ao mesmo problema / eu apenas esfaqueando aqui no escuro ...
EDITA
Antes, eu disse que não queria mudar o código da biblioteca SimpleTimer. Quero voltar a este, acho que alterá-lo, seria a melhor opçã
Obrigado por todas as respostas atuais, eu só estava autorizado a sinalizar uma como uma resposta viável, na verdade tudo o que li aqui foi extremamente úti
Para continuar, altere o código do SimpleTimer. Essa classe precisa ter uma referência ao objeto que contém minha função "parar", certo? Então, sobrecarregar a função settimer para algo que leva meu objeto e minha função como dois ponteiros separados funcionaria ...? Acho que estou pegando o jeito, mas ainda não estou lá com a cabeç
EDITA
Eu não sei quem veio com este novamente, mas, alguém encontrando esta discussão. Se encontradoonteiros de função de membro e os delegados C ++ mais rápidos possíve para dar uma introdução muito agradável aos ponteiros de função e ponteiros de função de membr
EDITA
Fique funcionando, alterou a biblioteca SimpleTimer para usar este sistema Delegado:http: //www.codeproject.com/KB/cpp/FastDelegate.asp
Integrou-se muito bem e pode ser bom ter um sistema Delegado padrão como este na biblioteca do Arduin
Code como no teste (trabalhando)
typedef
typedef FastDelegate0<> FuncDelegate;
Code na classe do robô:
void Robot::test(){
FuncDelegate f_delegate;
f_delegate = MakeDelegate(this, &Robot::halt);
timer.setTimerDelg(1, f_delegate, 1);
}
void Robot::halt() {
Serial.println("TEST");
}
Code na classe SimpleTimer:
int SimpleTimer::setTimerDelg(long d, FuncDelegate f, int n){
f();
}
@Arduino imprime TEST no consol
Próximo passo, colocando-o em uma matriz, não vejo muitos problemas por lá. Obrigado a todos, não acredito no que aprendi em dois dias.
Que cheiro é esse? Esse é o cheiro de ...? Sucesso
Para os interessados, o sistema Delegado usado não representa problemas de capacidade de memória: Com o FastDelegate
AVR Memory Usage
----------------
Device: atmega2560
Program: 17178 bytes (6.6% Full)
(.text + .data + .bootloader)
Data: 1292 bytes (15.8% Full)
(.data + .bss + .noinit)
Finished building: sizedummy
Sem FastDelegate:
AVR Memory Usage
----------------
Device: atmega2560
Program: 17030 bytes (6.5% Full)
(.text + .data + .bootloader)
Data: 1292 bytes (15.8% Full)
(.data + .bss + .noinit)
Finished building: sizedummy