(它应该在Arduino上运行,所以我不能使用大型库。)
首先,我正在使用这个Arduino库:
/* SimpleTimer - A timer library for Arduino.
* Author: mromani@ottotecnica.com
* Copyright (c) 2010 OTTOTECNICA Italy
*/
这个函数接受一个函数作为参数,在一定时间间隔内循环调用该函数:
typedef void (*timer_callback)(void);
就我所知,这是一个无类函数。网页指向成员函数的指针让我受益匪浅,但还不够深入。可能是我的术语不足造成的。现在,我已经制作了自己的类,并希望使用此SimpleTimer库。但如果我把我的类函数传递给SimpleTimer,它就不喜欢它们(据我理解)。那么,在不改变SimpleTimer库的情况下,如何实现这一点呢?
因此,有一个名为Robot的类,其中包含
Robot::halt()
。我想让机器人向前移动一定时间。就像这样: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);
}
c_func变量在这一点上是一个无类函数,但我想使用Robot::halt函数。 我已经查找、阅读、学习过了,但还没有成功。 我似乎无法理解这个问题,因为我缺少某些角度。
我尝试过:
timer.setTimer(time, (this->*halt), 1);
timer.setTimer(time, Robot::*halt, 1);
timer.setTimer(time, &Robot::halt), 1);
但这只会导致同样的问题/我在这里瞎猜...
编辑
早些时候,我说不想改变SimpleTimer库的代码。我想重新考虑这个问题,我想改变它似乎是更好的选择。
感谢所有当前的答案,我只被允许标记其中一个为可行答案,实际上我读到的每一条都非常有帮助。
为了继续下去,改变SimpleTimer代码。这个类需要引用持有我的“halt”函数的对象,对吗?所以,重载settimer函数以采用我的对象和我的函数作为两个单独的指针会起作用……?我想我已经理解了这个,但是我的脑子还没有完全明白。
编辑
我不知道这又是谁想出来的,但是任何找到这个线程的人都可以看到成员函数指针和最快的C++委托,它提供了一个非常好的函数指针和成员函数指针介绍。
编辑
搞定了,改变了SimpleTimer库以使用这个Delegate系统:http://www.codeproject.com/KB/cpp/FastDelegate.aspx
它整合得非常好,将一个标准的Delegate系统像这样放在Arduino库中可能很不错。
代码如下(工作)
typedef
typedef FastDelegate0<> FuncDelegate;
机器人类中的代码:
void Robot::test(){
FuncDelegate f_delegate;
f_delegate = MakeDelegate(this, &Robot::halt);
timer.setTimerDelg(1, f_delegate, 1);
}
void Robot::halt() {
Serial.println("TEST");
}
SimpleTimer类中的代码:
int SimpleTimer::setTimerDelg(long d, FuncDelegate f, int n){
f();
}
Arduino会在控制台中打印TEST。
接下来是把它放进一个数组中,我认为不会有太多问题。感谢大家,我简直不敢相信我在两天内学到了这么多东西。
那是什么味道?是成功的味道吗?
对于那些感兴趣的人,所使用的Delegate系统不会导致内存容量问题:使用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
没有使用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
memcmp
未声明的问题?你有修改后的SimpleTimer源代码可用吗? - Thomas Nadin