我不太确定我该怎么做,arduino-c++的人,所以我问你们两个。
我正试着为Arduino建一个小图书馆。在无法更改结构的成员变量时,我遇到了问题。我只会展示代码并告诉你出了什么问题。
ButtonGroup.h:
#ifndef BUTTONGROUP_H
#define BUTTONGROUP_H
#include "Arduino.h"
struct button {
int buttonState;
int lastButtonState;
int pin;
void (*f)(int);
};
class ButtonGroup {
public:
ButtonGroup(int dimension);
~ButtonGroup();
virtual void addButton(int pin, void (*f)(int));
virtual void loopButtons();
private:
button* buttons;
int count;
};
#endif
ButtonGroup.cpp:
#include "ButtonGroup.h"
ButtonGroup::ButtonGroup(int dimension) {
buttons = new button[dimension];
count = 0;
}
ButtonGroup::~ButtonGroup() {
delete [] buttons;
}
void ButtonGroup::addButton(int pin, void (*f)(int)){
button b = {0, 0, pin, f};
buttons[count] = b;
pinMode(pin, INPUT);
count++;
}
void ButtonGroup::loopButtons(){
for(int i=0; i<count; i++) {
button b = buttons[i];
b.buttonState = digitalRead(b.pin);
if (b.buttonState == 0 && b.lastButtonState == 1) {
(b.f(2));
}
b.lastButtonState = b.buttonState;
}
}
我尝试检测我的按钮何时碰到下降的边缘(prevoius按钮状态为1,当前为0),然后调用成员函数。我的问题是,当我试图更改最后一行中的lastButtonState时,下一次调用loopButtons()时,该值并没有改变。好像我在做一个本地副本之类的事情,但是既然我正在访问一个数组,我认为应该可以吗?我怀疑它有一些指针/引用/值要做,但我不知道如何绕过它。
我通过Arduino IDE运行并编译代码。
谢谢!
发布于 2014-04-03 13:50:01
就像你在addButton
做的一样
button b = {0, 0, pin, f}; // Local Object
buttons[count] = b; // copied to array via assignment
你的管理者也是,但恰恰相反:
button b = buttons[i]; // Local object copy-constructed from array element
b.buttonState = digitalRead(b.pin); // remaining code working on local copy.
通过使用引用,不会复制,我们通过引用变量引用数组项:
button& b = buttons[i]; // using reference to buttons[i]
b.buttonState = digitalRead(b.pin); // remaining code modifying buttons[i] using b
发布于 2014-04-03 13:55:33
在ButtonGroup::loopButtons()函数中,可以声明
button b = buttons[i];
此时,您正在创建一个b变量,类型为按钮。当您应用转让人(=buttonsi)时,您将获取新按钮b,并将存储在i按钮下的按钮的值给它。
您可以通过将行更改为button& b = buttons[i];
来解决这个问题。
这将创建对按钮的引用,该按钮具有所需的效果。
如果您不介意两种类型的切入点:B是一个糟糕的变量名,那么您应该更喜欢使用c++数组或向量,而不是c样式数组。
https://stackoverflow.com/questions/22839385
复制相似问题