Проблема с заполнением массива целыми числами [Arduino]

#c #arrays #c #arduino

#c #массивы #c #arduino

Вопрос:

возникла проблема с заполнением массива из Serial. Итак, по сути, сначала запрашивается длина массива, затем следует ввести из keyborad все элементы. Проблема в том, что он не ждет ввода значений в 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));
    }
  }
}

 

Комментарии:

1. Это не заставляет ждать, как просили, но вы можете использовать Serial.setTimeout() для увеличения времени ожидания.

2. рекомендуемый стиль — if (!fill) вместо if (fill == false) bool выражения могут быть вычислены напрямую (поскольку fill bool в любом случае являются переменной) в условиях и не сравниваются с логическим значением.

3. int tab[lengthOfArray]; это утверждение (VLA — массив переменной длины, динамически распределяемый в стеке) не соответствует C . Хотя это работает на C и некоторых компиляторах C , если вы хотите быть идиоматичным на C , это должно выглядеть так: std::vector<int> tab(lengthOfArray, 0); . Однако, если это предназначено для C, тогда вам не нужно.

4. Каждый раз, когда вы проходите loop , вы начинаете заново с нового tab[] массива. Вероятно, это не то, что вы хотите. Кроме того, я думаю, нам нужно разрешить loop() возврат к коду поддержки Arduino, чтобы он собирал символы для последовательного чтения… Возможно, переосмыслите, как собирать целые числа по одному каждый раз в цикле и помещать их в глобальный массив за пределами loop() . В этом случае также следует проверять пределы массива, чтобы избежать переполнения. (Вопрос: что, если первое прочитанное целое число окажется равным 0? Доверять пользовательскому вводу всегда опасно.)

5. Он предназначен для создания всего в одном цикле. Думал заполнить массив по одному элементу за один цикл, но понятия не имею, как сделать массив глобальным значением, не зная длины. Также он не должен быть очень осведомлен о неправильных вводах, просто заполняя массив, предполагая, что мы предоставляем фиксированные вводы. Спасибо

Ответ №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));