我正在尝试编程非阻塞LED闪烁。
因此,我编写了一个小课程:03: class timer {
04: private:
05: int startMillis;
06: int delayMillis;
07: public:
08: timer ( int pDelay ) {
09: reset ( pDelay );
10: }
11: void start () {
12: startMillis = millis();
13: }
14: void reset ( int pDelay ) {
15: delayMillis = pDelay;
16: }
17: boolean checkTimer () {
18: if ( (millis() - startMillis) >= delayMillis ) {
19: return true;
20: } else {
21: return false;
22: }
23: }
24: };
然后我想在loop()中做这样的事情:
42: void switchLed (int *pPin, timer *pTimer) {
43: if ( (*pTimer->checkTimer()) == true ) {
44: if ( bitRead(PORTD, *pPin) == HIGH ) {
45: digitalWrite(*pPin, LOW);
46: } else {
47: digitalWrite(*pPin, HIGH);
48: }
49: *pTimer->start();
50: }
51: }
我使用参数“(& led [0],& ledTimer01)”调用loop()中的switchLed()函数。 我认为它应该可行,但我的编译器说
nonblockingblink:5: error: 'timer' has not been declared
nonblockingblink.ino: In function 'void switchLed(int*, timer*)':
nonblockingblink:43: error: invalid type argument of 'unary *'
nonblockingblink:49: error: void value not ignored as it ought to be
问题出在哪里? 谢谢你的帮助:)。
答案 0 :(得分:1)
pTimer->checkTimer()
的类型为boolean
所以这个:
*pTimer->checkTimer()
无效,因为boolean
不是指针类型。
其他功能相同,为什么使用*
运算符?
这是不正确的:
*pTimer->start();
这是正确的:
pTimer->start();
或
(*pTimer).start(); // equivalent to above, prefer the above form
答案 1 :(得分:1)
您使用两种类型的指针解除引用。首先使用->
访问pTimer
结构成员,然后再次使用*
非指针类型(boolean
返回checkTimer
) 。删除星号,它应该工作。