Доброго всем дня.
Вопрос знатокам программирования.При компиляции скетча выход вот такое предупреждение:
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
- Откуда: Коломна
- Имя: Станислав
- Контактная информация:
Ошибка при компилировании скетча
Если 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 бита влево.
Создается временная переменная 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 бита влево.
Ошибка при компилировании скетча
[ref]Boroda[/ref], не могли бы вы подробнее описать что это за ошибка и откуда она лезет для человека далекого от программирования? Использую Flprog 3.0.3 и при компиляции скетча выползает такая же ошибка.. Где нужно объявить переменные - в setup? Может есть шанс вообще обойти эту ошибку без исправлениЙ в среде IDE?
Ошибка при компилировании скетча
нужно найти блок в проекте который вызывает эту ошибку. судя по первому посту это относится к блокам панели nextion
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей