struct-member变量没有改变

时间:2014-04-03 13:33:22

标签: c++ arduino

我不太确定我应该这个人,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运行并编译代码。

谢谢!

2 个答案:

答案 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样式数组。