我不太确定我应该这个人,c ++的arduino伙伴们,所以我问你们两个。
我正在尝试为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运行并编译代码。
谢谢!
答案 0 :(得分:2)
就像你在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
答案 1 :(得分:1)
在函数ButtonGroup :: loopButtons()中,声明
button b = buttons[i];
此时您正在创建一个类型为按钮的变量b。当您应用assignemnent(= buttons [i])时,您正在使用 new 按钮b并为其提供按钮[i]中存储的按钮的值(即您正在复制按钮)。 / p>
您可以通过将行更改为来解决此问题
button& b = buttons[i];
这将创建对按钮[i]中存储的按钮的引用,该按钮具有所需的效果。
如果你不介意几个样式的指针:b是一个糟糕的变量名,你应该更喜欢使用c ++数组或向量而不是c样式数组。