#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));