首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >结构成员变量

结构成员变量
EN

Stack Overflow用户
提问于 2014-04-03 13:33:21
回答 2查看 63关注 0票数 0

我不太确定我该怎么做,arduino-c++的人,所以我问你们两个。

我正试着为Arduino建一个小图书馆。在无法更改结构的成员变量时,我遇到了问题。我只会展示代码并告诉你出了什么问题。

ButtonGroup.h:

代码语言:javascript
运行
复制
#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:

代码语言:javascript
运行
复制
#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运行并编译代码。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-03 13:50:01

就像你在addButton做的一样

代码语言:javascript
运行
复制
button b = {0, 0, pin, f}; // Local Object
buttons[count] = b;        // copied to array via assignment

你的管理者也是,但恰恰相反:

代码语言:javascript
运行
复制
button b = buttons[i]; // Local object copy-constructed from array element

b.buttonState = digitalRead(b.pin); // remaining code working on local copy.

通过使用引用,不会复制,我们通过引用变量引用数组项:

代码语言:javascript
运行
复制
button& b = buttons[i]; // using reference to buttons[i]

b.buttonState = digitalRead(b.pin); // remaining code modifying buttons[i] using b
票数 2
EN

Stack Overflow用户

发布于 2014-04-03 13:55:33

在ButtonGroup::loopButtons()函数中,可以声明

button b = buttons[i];

此时,您正在创建一个b变量,类型为按钮。当您应用转让人(=buttonsi)时,您将获取新按钮b,并将存储在i按钮下的按钮的值给它。

您可以通过将行更改为button& b = buttons[i];来解决这个问题。

这将创建对按钮的引用,该按钮具有所需的效果。

如果您不介意两种类型的切入点:B是一个糟糕的变量名,那么您应该更喜欢使用c++数组或向量,而不是c样式数组。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22839385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档