提问者:小点点

为什么这个Arduino while循环永远不会结束?


这可能是最糟糕的方式,但我希望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() {
     }
    

  • 共2个答案

    匿名用户

    问题是您再次在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() {
     }
    

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

    匿名用户

    为了使eventHandler的(正确)响应稍微清晰一些,因为对于阅读它的人来说似乎仍然有困惑:

    问题出在线路上

    int random_number = random(-1,2);
    

    因为通过包含类型说明符(int声明器),在while循环的范围内声明了一个名为random_number的新变量。如前所述,该变量与行中全局声明的变量不同

    int random_number = 0;
    

    因此,它不是在while循环条件中使用的。

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

    因此,while 循环中random_number的定义应为:

    random_number = random(-1,2);
    

    在这种情况下,全局变量被分配了一个新值(而不是分配了一个新变量),代码片段中只存在该名称的一个变量,问题就解决了。