Serial + Массив

Александр X7
Offline
Зарегистрирован: 08.06.2021

Имеется вот такой код


int MyMassiv[5];

void setup()
{
Serial.begin(9600);
}

void loop()
{
if (Serial.available() > 0) 
 { 
 MyMassiv[3] = Serial.parseInt(); 
 int x = MyMassiv[3]+2;
 Serial.println(x); 
 }
}

По моим представлениям он должен делать так:

Если в сериал порте есть целое число, то он берет это целое число и отправляет в массив.

Потом приравнивает переменную X к сумме этого элемента массива и числа 2.

А далее вывод переменной X в сериал порт.

НО ЭТО ТАК НЕ РАБОТАЕТ Точнее работает странно.

Например мы водим в сериал порт число 3 Число 3 не появляется а появляется 5 сразу.

А потом через секунду появляется число 2!!!

То число которое мы суммируем с элементом массива!

Подскажите кто знает как с этим работать.

rkit
Offline
Зарегистрирован: 23.11.2016

Ну для начала нужно взять и внимательно прочитать описание всех использованных функций.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Александр X7 пишет:

Например мы водим в сериал порт число 3 Число 3 не появляется а появляется 5 сразу.

А что, 3+2 уже не 5? Я что-то проспал?

Что касается дальнейшего, то Вы не чистите порт от символов перевода строки в возврата каретки.

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

Что касается дальнейшего, то Вы не чистите порт от символов перевода строки в возврата каретки.

Евгений, сорри за оффтоп, не подскажете ссылку на Ваше обьяснение, насчет "неопределенного поведения" компилятора при union и приведении типов?

sadman41
Offline
Зарегистрирован: 19.10.2016

А мне ссылку на автомат Милли (или как там его). В первотопике песочницы не нашёл.

b707
Offline
Зарегистрирован: 26.05.2017

надо наверно в "Отвлеченных" завести тему , что-то типа "Ищу ссылку" :)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Александр X7 пишет:

Имеется вот такой код


int MyMassiv[5];

void setup()
{
Serial.begin(9600);
}

void loop()
{
if (Serial.available() > 0) 
 { 
 MyMassiv[3] = Serial.parseInt(); 
 int x = MyMassiv[3]+2;
 Serial.println(x); 
 }
}

По моим представлениям он должен делать так:

С Вашим представлением я спорить не буду, а по моим представлениям код должен делать в точности то, что написано.

Что, собственно, и происходит.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:
насчет "неопределенного поведения" компилятора при union и приведении типов?

http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/predstavlenie-...

Сейчас перечитал, там как-то размазано. Можно короче сказать: всякий раз, когда в переменной получается то-либо не представимое её типом - это "неопределённое поведение":

«If during the evaluation of an expression, the result is not mathematically defined or not in the range of representable values for its type, the behavior is undefined» (стр. 105 по файлу в песочнице, §8(4))

А если union накладывает на одну память переменные типов A и B, то манипуляции с переменной типа A могут запросто привести к тому в переменной типа B окажется нечто в её типе не представимое. Вот и "undefined behavior" в полный рост.

sadman41 пишет:

А мне ссылку на автомат Милли (или как там его). В первотопике песочницы не нашёл.

http://arduino.ru/forum/otvlechennye-temy/private-property-no-trespassin...

Там дальше по теме уточнения, ответы на вопросы и пример.

b707
Offline
Зарегистрирован: 26.05.2017

спасибо