Ошибка при компилировании скетча

В этот форум модератором или автором переносятся темы из форума "Принятые" которые приняты к рассмотрению и исправлению
Ответить
Texxx
Рядовой
Сообщения: 5
Зарегистрирован: 06 фев 2017, 08:13
Откуда: Новосибирск

Ошибка при компилировании скетча

Сообщение Texxx »

Доброго всем дня.
Вопрос знатокам программирования.При компиляции скетча выход вот такое предупреждение:
C:\Temp\flprog\pr48\pr48.ino: In function '_nextionLissenStruct nextionListen(byte)':

C:\Temp\flprog\pr48\pr48.ino:935:27: warning: left shift count >= width of type

  temp.number = (cmd[4] << 24) | (cmd[3] << 16) | (cmd[2] << 8) | (cmd[1]);

                           ^

C:\Temp\flprog\pr48\pr48.ino:935:44: warning: left shift count >= width of type

  temp.number = (cmd[4] << 24) | (cmd[3] << 16) | (cmd[2] << 8) | (cmd[1]);

                                            ^
Что сиё может значить?
Компиляция завершается и программа записывается в ардуино. Но работать не хочет.
Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01 май 2016, 01:04
Откуда: Коломна
Имя: Станислав
Контактная информация:

Ошибка при компилировании скетча

Сообщение Boroda »

Если cmd типа byte, то при сдвижке на 8, 16 или 24 оно будет равно нулю. Как это делает компилятор:

Создается временная переменная TMP типа byte (тип этой переменной такой же как и тип cmd[x]).

temp.number = 0;
TMP = cmd[4] << 24; // это равно нулю, потому как байт задвигается влево на 24 бита.
temp.number |= TMP;
TMP = cmd[3] << 16; // это равно нулю, потому как байт задвигается влево на 16 бит.
temp.number |= TMP;
TMP = cmd[2] << 8; // это равно нулю, потому как байт задвигается влево на 8 бит.
temp.number |= TMP;
TMP = cmd[1];
temp.number |= TMP; // итоговый результат temp.number = cmd[1];

Чтобы заработало, надо сделать так:
temp.number = 0;
temp.number = cmd[4]; // записали в младший байт
temp.number = temp.number << 8; // сдвинули на 8
temp.number |= cmd[3]; // OR в младший байт
temp.number = temp.number << 8; // сдвинули на 8
temp.number |= cmd[2];
temp.number = temp.number << 8;
temp.number |= cmd[1];

Добавлено (28.04.2017, 20:52)
---------------------------------------------
Тоже несколько раз наступал на эти грабли. Чтоб заработала данная строка, переменная CMD должна быть типа UnsignedLong, тогда она может двигаться на 24 бита влево.
Rom4ell0
Рядовой
Сообщения: 7
Зарегистрирован: 20 янв 2018, 21:08

Ошибка при компилировании скетча

Сообщение Rom4ell0 »

[ref]Boroda[/ref], не могли бы вы подробнее описать что это за ошибка и откуда она лезет для человека далекого от программирования? Использую Flprog 3.0.3 и при компиляции скетча выползает такая же ошибка.. Где нужно объявить переменные - в setup? Может есть шанс вообще обойти эту ошибку без исправлениЙ в среде IDE?
pan
Полковник
Сообщения: 2860
Зарегистрирован: 13 апр 2017, 11:57
Имя: noname

Ошибка при компилировании скетча

Сообщение pan »

Rom4ell0 писал(а): 26 фев 2018, 23:25 Может есть шанс вообще обойти эту ошибку
нужно найти блок в проекте который вызывает эту ошибку. судя по первому посту это относится к блокам панели nextion
Ответить

Вернуться в «Принятые»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей