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

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

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

#1

Сообщение Texxx » 28.04.2017{, 19:09}

Доброго всем дня.
Вопрос знатокам программирования.При компиляции скетча выход вот такое предупреждение:
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.05.2016{, 01:04}
Репутация: 38
Откуда: Коломна
Имя: Станислав
Контактная информация:

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

#2

Сообщение Boroda » 28.04.2017{, 20:52}

Если 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.01.2018{, 21:08}
Репутация: 0

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

#3

Сообщение Rom4ell0 » 26.02.2018{, 23:25}

Boroda, не могли бы вы подробнее описать что это за ошибка и откуда она лезет для человека далекого от программирования? Использую Flprog 3.0.3 и при компиляции скетча выползает такая же ошибка.. Где нужно объявить переменные - в setup? Может есть шанс вообще обойти эту ошибку без исправлениЙ в среде IDE?

pan
Полковник
Сообщения: 2860
Зарегистрирован: 13.04.2017{, 11:57}
Репутация: 204
Имя: noname

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

#4

Сообщение pan » 26.02.2018{, 23:40}

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

Ответить

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