2016-08-13 70 views
0

我正在研究Arduino的LED推子。为此我写了一个定义一切的类。但从昨天起我有一个问题,我无法解决它。 到目前为止,这里是我的代码:类中的变量自己重置

class LED { 
    int pins[4]; 
    int r = 0; 
    int g = 0; 
    int b = 0; 
    int task = 1; 
    int taskgoal = 255; 
    public: 
    void newTask() { 
     ... 
    } 
    void newGoal() { 
     ... 
    } 
    boolean taskFinished() { 
     ... 
    } 
    void runTask() { 
     if (taskFinished()) { 
     newTask(); 
     newGoal(); 
     cout << "New Task and new Goal.\n"; 
     } 
     int current; 
     switch (task) { 
     ... 
     } 
     if (current < taskgoal) { 
     switch (task) { 
      case 1: 
      cout << r << "+1" << "\n"; 
      this->redefine(this->r + 1, this->g, this->b); 
      cout << r << "+1" << "\n"; 
      break; 
      case 2: 
      cout << g << "+1" << "\n"; 
      this->redefine(this->g, this->g + 1, this->b); 
      break; 
      case 3: 
      cout << b << "+1" << "\n"; 
      this->redefine(this->r, this->g, this->b + 1); 
      break; 
     } 
     } else if (current > taskgoal) { 
     ... 
     } 
     analogWrite(pins[0], this->r); 
     analogWrite(pins[1], this->g); 
     analogWrite(pins[2], this->b); 
     return; 
    } 
    void ledinit(int p[]) { 
     this->r = random(1, 255); 
     this->g = random(1, 255); 
     this->b = random(1, 255); 
     for (int i = 1; i < 3; i++) { 
     pins[i] = p[i]; 
     pinMode(pins[i], OUTPUT); 
     } 
     pins[3] = p[3]; 
     analogWrite(pins[0], this->r); 
     analogWrite(pins[1], this->g); 
     analogWrite(pins[2], this->b); 
     analogWrite(pins[3], LOW); 
     newTask(); 
     newGoal(); 
     runTask(); 
     return; 
    } 
    void redefine(int rr, int gg, int bb) { 
     r = rr; 
     g = gg; 
     b = bb; 
     return; 
    } 
}; 
std::vector<LED>leds; 

void setup() { 
    Serial.begin(9600); 
    LED l1; 
    int l1pins[4] = {11, 9, 8, 10}; 
    l1.ledinit(l1pins); 
    leds.push_back(l1); 
} 

void loop() { 
    for (LED l : leds) { 
    l.runTask(); 
    cout << "Run Task" << "\n"; 
    } 
    delay(100); 
} 

(引擎收录:http://pastebin.com/pQMEkG1a) 在76线我尝试加1我的功能重新定义了R值。我也直接用this->r++;this->r += 1;尝试过,但都有相同的结果。它会将1添加到r变量中。但是在下一个循环中,它又像开始时一样。这就是输出的样子:

Run Task 
45+1 
46+1 
Run Task 
45+1 
46+1 
Run Task 
45+1 
46+1 

但是为什么每次都是45?我认为这是一个非常容易的错,但我找不到它。

+0

首先学习如何创建一个[Minimal,Complete,and Verifiable Example](http://stackoverflow.com/help/mcve),然后将该MCVE *作为文本复制粘贴到问题主体中。另请[请阅读如何提出好问题](http://stackoverflow.com/help/how-to-ask)。 –

+0

请将您的代码发布到问题中。链接随着时间的推移可能会失效 – SurvivalMachine

+0

您是否可以编辑粘贴示例以包含pastebin链接(http://pastebin.com/pQMEkG1a)和循环方法? – JVApen

回答

1

看代码,我希望,你的问题就在于内for (LED l : leds)

这个范围为基础的在LED的向量循环,从每个元素的副本,在其上运行的任务需要。

我会建议编写以下内容:for (LED &l : leds)以防止复制。

,因为它看起来像你的编译器支持C++ 11,你可能想通过添加下面的成员函数的类LED,以防止今后再发生类似的问题:LED(const LED &) = delete;the rule of five可能是几个人。这将防止任何副本从领导。可能你会需要一些移动构造函数来添加矢量中的LED。

+0

谢谢你的工作。但如果我添加'LED(常量LED&)=删除;'我无法启动我的led变量。 –

+0

我试图添加像这样http://pastebin.com/605Q5yKj的五个规则,但它不工作。也许我误解了一些东西。 –

+0

我想这应该可以工作,但不要忘记,你实际上必须移动:v.push_back(std :: move(led)); – JVApen