FLProg
Вход на сайт
Логин:
Пароль:
Поиск
...
Статистика
Четверг, 27.07.2017, 01:38
Приветствую Вас Гость | RSS
Главная | Регистрация | Вход

Поиск по сайту


Форум
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Модератор форума: Сергей, support 
Форум » Баг - Трекер » Принятые » Ошибка при компилировании скетча (Ошибки при компиляции)
Ошибка при компилировании скетча
Texxx Дата: Пятница, 28.04.2017, 19:09 | Сообщение # 1
Рядовой
Группа: Проверенные
Сообщений: 1
Награды: 0
Репутация: 0
Статус: Offline
Доброго всем дня.
Вопрос знатокам программирования.При компиляции скетча выход вот такое предупреждение:
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 Дата: Пятница, 28.04.2017, 20:52 | Сообщение # 2
Генерал-лейтенант
Группа: Проверенные
Сообщений: 793
Награды: 35
Репутация: 36
Статус: Offline
Если 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 бита влево.

 
Форум » Баг - Трекер » Принятые » Ошибка при компилировании скетча (Ошибки при компиляции)
Страница 1 из 11
Поиск:

FLProg © 2017
Яндекс.Метрика