【问题标题】:Why does this Arduino while loop never end?为什么这个 Arduino while 循环永远不会结束?
【发布时间】:2021-01-11 01:52:46
【问题描述】:

这可能是最糟糕的方法,但我希望 Arduino 在 1 和 -1 之间进行选择。这段代码不工作,怎么回事。

这是我对代码的理解:

  • int 定义为 0。

  • while 循环开始,因为条件为真。

  • 选择了一个随机变量。

  • 如果 int 为 1 或 -1,则 while 循环结束,值为 打印出来的。

  • 如果 int 为 0,while 循环将重新启动。

    int random_number = 0;
    
     void setup() {
       Serial.begin(9600);
       while (random_number == 0){
           int random_number = random(-1,2);
           Serial.println(random_number);
           delay(1000);
       }
       Serial.print("value ");
       Serial.println(random_number);
     }
    
     void loop() {
     }
    

【问题讨论】:

    标签: while-loop arduino


    【解决方案1】:

    问题是您在 while 循环中再次声明 random_number。这是循环局部范围内的一个新的不同变量,而不是在代码开头全局声明的变量。此外,它会在每个循环中再次声明。

     int random_number = 0;
    
     void setup() {
       Serial.begin(9600);
       while (random_number == 0){
           random_number = random(-1,2); // not declared again
           Serial.println(random_number);
           delay(1000);
       }
       Serial.print("value ");
       Serial.println(random_number);
     }
    
     void loop() {
     }
    

    请注意,int random_number 在循环内被 random_number 替换。现在使用全局声明的变量random_number,而不是声明一个新的同名局部变量。

    【讨论】:

    • 您的解决方案是在 setup 函数中移动第一行吗?这仍然无法正常工作。
    【解决方案2】:

    为了让eventHandler's(正确)回复更加清晰,因为阅读它的人似乎仍然感到困惑:

    问题出在线路上

    int random_number = random(-1,2);
    

    因为包含了一个类型说明符int 声明符),一个名为random_number 的新变量被声明为while 循环的范围内.如前所述,此变量与行中全局声明的变量不同

    int random_number = 0;
    

    因此它不是while 循环条件中使用的那个。

    通常,编译器会将多重声明标记为问题,但由于问题中的变量具有不同的作用域,因此实际执行的操作称为遮蔽。在这里,循环的random_number 隐藏(或隐藏)在全局范围内声明的那个,因此它被分配了一个随机数而不是预期的变量。当解析具有不同范围的变量时,“最局部”的变量优先于“最不局部”的变量。

    while 循环中random_number 的定义应为:

    random_number = random(-1,2);
    

    在这种情况下,全局变量被分配一个新值(而不是一个新变量被分配一个),代码 sn-p 中只存在一个同名的变量,问题得到解决。

    【讨论】:

      猜你喜欢
      • 2013-09-11
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多