【问题标题】:Problem with filling array with ints [Arduino]用整数填充数组的问题[Arduino]
【发布时间】:2021-04-12 07:04:31
【问题描述】:

从 Serial 填充数组时遇到问题。 所以基本上,首先要求数组的长度,然后应该从键盘输入所有元素。问题是它没有等待将值输入到 Serial 中而只是用 0 填充。如果立即输入值,它会将它们放入数组中。

我的问题是如何强制从 Arduino 等待,直到我输入值。 谢谢!

boolean fill = false;
int sum = 0;
int lengthOfArray;

void setup() 
{
  Serial.begin(9600);
  Serial.print("Set lenght of array : ");
}

void loop() 
{
  if(fill == false)
  {
    if(Serial.available() > 0)
    {
      lengthOfArray = Serial.parseInt();
      Serial.println(lengthOfArray);
      int tab[lengthOfArray];

      for(int i = 0; i < lengthOfArray; i++)
      {
        delay(10);
        Serial.print("Tab[" + String(i) + "] : ");    
        tab[i] = Serial.parseInt();
        Serial.println(tab[i]);
        sum += tab[i];         
      }
      fill = true; 

      Serial.println("Sum = " + String(sum));
    }
  }
}

【问题讨论】:

  • 这不是按要求强制等待,但您可以使用Serial.setTimeout() 延长超时时间。
  • 推荐的样式是 if (!fill) 而不是 if (fill == false) - bool 表达式可以在条件中直接计算(因为 fill 无论如何都是 bool 变量)而不是与布尔值进一步比较.
  • int tab[lengthOfArray]; 此语句(VLA - 可变长度数组,动态分配在堆栈上)不符合 C++。虽然它适用于 C 和一些 C++ 编译器,但如果你想成为 C++ 惯用的,它应该看起来像:std::vector&lt;int&gt; tab(lengthOfArray, 0);。但是,如果这是 C 意图的,那么您不必这样做。
  • 每次通过loop 时,您都会从一个新的tab[] 数组重新开始。可能不是你想要的。另外,我认为我们需要让loop() 返回 Arduino 支持代码,以便它收集字符以进行串行读取...也许重新考虑如何通过循环每次一个接一个地收集整数,并存入它们位于loop() 之外的全局数组中。在这种情况下,也应该检查数组限制以避免溢出。 (问:如果读取的第一个整数恰好是 0 怎么办?相信用户输入总是很危险的。)
  • 它旨在使所有内容在一个循环中完成。正在考虑为每个循环填充一个数组,但不知道如何在不知道长度的情况下将数组设为全局值。此外,假设我们提供固定输入,它不应该非常了解错误输入,只需简单地填充数组即可。谢谢

标签: c++ arrays c arduino


【解决方案1】:

如果我正确理解了您的问题,您愿意一次打印所有值,而不是为您键入的每个值。

您可以维护单独的 for 循环来读取然后打印

      for(int i = 0; i < lengthOfArray; i++)
      {
        delay(10);
        Serial.print("Tab[" + String(i) + "] : ");    
        tab[i] = Serial.parseInt();
        sum += tab[i];         
      }
      fill = true;
      for(int i = 0; i < lengthOfArray; i++) 
        Serial.println(tab[i]);

      Serial.println("Sum = " + String(sum));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 2011-09-14
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多