реклама на сайте
подробности

 
 
> Интересный глюк в CodeVisionAVR
DMD
сообщение Apr 17 2008, 09:02
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 120
Регистрация: 19-02-08
Пользователь №: 35 166



Обнаружил интересный глюк в CodeVision, целый день вчера просидел - думал во мне дело, оказалось, что нет.
Если мы делаем сдвиг и результирующее число выходит из размера 1 байта, то, почему-то, компилятор не преобразует его к int (хотя обязан по стандарту). То есть вот такой код работает непрявильно:
Код
unisigned char s = 243;
//...
unsigned int d = (unsigned int)(s << 4);  // d != 3888


а надо так делать, что глупо...

Код
unisigned char s = 243;
//...
unsigned int d = (unsigned int)(((unsigned int)s) << 4);  // d = 3888


Интересно, зачем это надо или это просто баг??..


--------------------
Все будет хорошо! Я проверял!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Apr 17 2008, 09:17
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Да, выходит, это еще одно несоответствие стандарту этого компилятора.
Можно написать проще:
Код
unsigned int d = (unsigned int)s << 4;


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
defunct
сообщение Dec 3 2008, 00:15
Сообщение #3


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Сергей Борщ @ Apr 17 2008, 11:17) *
Можно написать проще:
Код
unsigned int d = (unsigned int)s << 4;

Можно написать еще проще
Код
unsigned int d = s << 4;

зачем делать приведение типа в правой части, если в левой части и так unsigned int.

к тому же
Цитата
Все операнды типа unsigned char или unsigned short преобразуются в тип unsigned int.



Цитата(zhevak @ Dec 2 2008, 17:52) *
разумеется, такой:

Неочевидно, потому что ваш пример вообще неоткомилируется, неизвестно что такое rus smile.gif

Очень странно как вы использовали этот код и не наткнулись на проблему раньше, ведь 3/4 символов, в т.ч. и цифры, были недоступными!

По теме CV согласен - фтопку этот недоинструмент.
Go to the top of the page
 
+Quote Post
zhevak
сообщение Dec 3 2008, 21:26
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата
defunct[/b]' date='Dec 3 2008, 05:15' post='510351']
Неочевидно, потому что ваш пример вообще неоткомилируется, неизвестно что такое rus smile.gif (1)

Очень странно как вы использовали этот код и не наткнулись на проблему раньше, ведь 3/4 символов, в т.ч. и цифры, были недоступными! (2)

1. Извините, это моя ошибка. Я описывал проблему выхода из функции и не подумал, что людей могут заинтересовать совсем другие вопросы. Вы правы, конечно этот код в таком виде не откомпилируется!

Ладно, попробую ответить на ваш вопрос. Начну с проблемы LCD, поскольку, у человека, который их ни разу не использовал возникают непонятки. У всех символьных LCD имеется встроенный знакогенератор (ну как минимум мне еще не попадались симольные LCD без оного). Младшая половина знакогенератора соответствует кодам ASCII. Проблемы заложены в старшей половине. Если у вас НЕ руссифицированный LCD, то, собственно, проблемы нет, т.к. в знакогенераторе кирилицы -- нет. Если LCD руссифицированный, то возникает проблема кодировки. Дело в том, что эта кодировка не совпадает ни с 866, ни с 1251. Я так понимаю, что производитель экономил память -- там, где изображение кириллических символов совпадает с изображением латинских символов, кириллические символы выкидывались. Например, кириллическая буква Р и латинская P, О и О, Н и Н, ну и т.д. Т.е. половина кириллического алфавита оказалась расположена в латинском. Понятно, что кодировка получилась весьма веселая.

С другой стороны, поскольку мы все пишем свои проги под Виндой, то стринги в исходниках тоже имеют виндовую кодировку. Теперь если прогу откомпилировать и залить в МК, то на LCD русские сообщения исказятся до неузнаваемости. Стало быть нужно произвести перекодировку. Это можно сделать либо до компиляции, либо во время исполнения проги в МК. Поскольку, объем флешь-памяти меня не напрягал, а вывод текстовой инфы на LCD занимает очень незначительное время, я решил незаморачиваться с перекодировкой до компиляции, а выполнять ее во время вывода строк. Тем более, что в проектах могут встретиться задачи, где стринг может прийти извне, например по RS232.

Соответственно во флешь-памяти МК располагалась таблица перекодировок. Имя этой таблицы -- rus. Функция перекодировки называлась translate.

Мне показалось, что это очевидные вещи, и я поэтому не стал особо заострять на этом внимание. Надеюсь, что я ответил на Ваш первый вопрос.

2. Вопрос будет посложнее. Если честно, то ахренегознаеттоваришмайор! Я могу только предполагать, что это особенность CV. Т.е. переменная data и результат функции раполагались в одном и том же регистре. Иначе говоря, если "насильственной" перекодировки не происходило, то функция возвращала то, что получала в качестве аргумента.

Еще раз повторю -- то, что я описал, такой код должен быть приравнен к ошибке. Компилятор пропустил. В моем случае, это не имело ни каких последствий (кроме, разве что, моего запоздалого испуга).


2 Nick_Shl Я обычно поднимаю все флаги на ошибки и предупреждения.


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
LordVader
сообщение Dec 4 2008, 10:26
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 127
Регистрация: 18-10-06
Пользователь №: 21 418



Цитата(zhevak @ Dec 4 2008, 01:26) *
Если LCD руссифицированный, то возникает проблема кодировки. Дело в том, что эта кодировка не совпадает ни с 866, ни с 1251. Я так понимаю, что производитель экономил память -- там, где изображение кириллических символов совпадает с изображением латинских символов, кириллические символы выкидывались. Например, кириллическая буква Р и латинская P, О и О, Н и Н, ну и т.д. Т.е. половина кириллического алфавита оказалась расположена в латинском. Понятно, что кодировка получилась весьма веселая.

Существуют индикаторы с 1251 кодировкой (как одной из возможных). Делает фирма МЭЛТ.



Прикрепленное изображение
Go to the top of the page
 
+Quote Post
zhevak
сообщение Dec 4 2008, 10:47
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(LordVader @ Dec 4 2008, 15:26) *
Существуют индикаторы с 1251 кодировкой (как одной из возможных). Делает фирма МЭЛТ.

Прикрепленное изображение

да. Спасибо.

Я вам больше скажу -- в мире существуют LCD с SPI интерфейсом... правда я их как-то не видел в продаже. Давайте сойдемся на том, что все это из разряда экзотики. В магазинах в основном продают LCD с "компактной" кодировкой и с традиционным интерфейсом.


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
LordVader
сообщение Dec 4 2008, 18:22
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 127
Регистрация: 18-10-06
Пользователь №: 21 418



Цитата(zhevak @ Dec 4 2008, 13:47) *
Я вам больше скажу -- в мире существуют LCD с SPI интерфейсом... правда я их как-то не видел в продаже. Давайте сойдемся на том, что все это из разряда экзотики. В магазинах в основном продают LCD с "компактной" кодировкой и с традиционным интерфейсом.

Ну не знаю. В пределах 'глобуса москвы' купить мэлтовские - не проблема. И даже тут есть http://www.terraelectronica.ru/catalog.php...e=2&PageS=1
У них 2 странички кодировки - одна какая на картинке, другая непойми какая, видимо как раз та, о которой вы говорили. По дефолту включена она же.
Go to the top of the page
 
+Quote Post
zhevak
сообщение Dec 4 2008, 19:15
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(LordVader @ Dec 4 2008, 23:22) *
Ну не знаю. В пределах 'глобуса москвы' купить мэлтовские - не проблема. И даже тут есть http://www.terraelectronica.ru/catalog.php...e=2&PageS=1
У них 2 странички кодировки - одна какая на картинке, другая непойми какая, видимо как раз та, о которой вы говорили. По дефолту включена она же.

все хорошо, но ведь не все живут в пределах Московского глобуса.

Имея большое желание получить себе на стол "экзотику", согласитесь, за ценой и временем можно не следить. Только почему-то в жизни часто получается так, что мы выбираем то, что легче достать, а потом это подгоняем напильниками. Мы рукастые, не ленивые, да и копейку умеем считать.
Поэтому вопрос бы и не возникал, если бы у нас были МЭЛТы в магазинах. А если еще по конкурентноспособной цене, да с кодировкой 1251 ... ха-ха-ха!

Есть реальная жизнь, и есть понятие "как надо жить". Это разные вещи, и очень часто они не совпадают. Поэтому, простите, живем, как умеем!

// Не обижайтесь! :-/ Это правда. (С) С легим паром!


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- DMD   Интересный глюк в CodeVisionAVR   Apr 17 2008, 09:02
|- - Сергей Борщ   Цитата(defunct @ Dec 3 2008, 02:15) Можно...   Dec 3 2008, 01:58
|- - defunct   zhevak за подробнейшие ответы.   Dec 3 2008, 22:47
- - prottoss   Цитата(DMD @ Apr 17 2008, 16:02) Обнаружи...   Apr 17 2008, 10:31
|- - Сергей Борщ   Цитата(prottoss @ Apr 17 2008, 13:31) А п...   Apr 17 2008, 11:20
|- - prottoss   Цитата(Сергей Борщ @ Apr 17 2008, 18:20) ...   Apr 18 2008, 00:42
|- - Andrew O. Shadoura   Цитата(Сергей Борщ @ Apr 17 2008, 14:20) ...   Apr 18 2008, 02:01
- - WHALE   Цитата(DMD @ Apr 17 2008, 13:02) Обнаружи...   Apr 17 2008, 12:33
- - DMD   Ворнинги не генерились, что и странно. А насчет то...   Apr 18 2008, 09:41
- - ReAl   Цитата(DMD @ Apr 17 2008, 12:02) Обнаружи...   Apr 18 2008, 14:50
|- - zhevak   Выбрось каку Прошу не пинать -- прошелся поиском...   Dec 2 2008, 15:52
||- - Nick_Shl   Цитата(zhevak @ Dec 2 2008, 17:52) Вопрос...   Dec 3 2008, 06:15
|- - delamoure   Цитата(ReAl @ Apr 18 2008, 16:50) Уже обс...   Dec 3 2008, 11:48
|- - Сергей Борщ   Цитата(delamoure @ Dec 3 2008, 13:48) Но ...   Dec 3 2008, 13:35
|- - SasaVitebsk   Цитата(Сергей Борщ @ Dec 3 2008, 17:35) Т...   Dec 3 2008, 23:53
|- - Qwertty   Цитата(SasaVitebsk @ Dec 4 2008, 02:53) В...   Dec 4 2008, 04:57
|- - Сергей Борщ   Цитата(SasaVitebsk @ Dec 4 2008, 01:53) А...   Dec 4 2008, 09:36
- - _Pasha   Интересно, какие грабельки еще подкинет 16-битная ...   Dec 3 2008, 14:22
|- - Serj78   Цитата(_Pasha @ Dec 3 2008, 17:22) Интере...   Dec 4 2008, 08:20
- - delamoure   Впрочем, IAR для меня не новость "Многостроч...   Dec 4 2008, 00:52
- - ARV   а как можно преобразовать строки для вывода на LCD...   Dec 4 2008, 09:51
|- - Сергей Борщ   Цитата(ARV @ Dec 4 2008, 11:51) понимаю, ...   Dec 4 2008, 10:16
||- - ARV   Цитата(Сергей Борщ @ Dec 4 2008, 13:16) Н...   Dec 4 2008, 10:19
||- - ReAl   Цитата(ARV @ Dec 4 2008, 12:19) это очеви...   Dec 5 2008, 11:06
|- - zhevak   Цитата(ARV @ Dec 4 2008, 14:51) а как мож...   Dec 4 2008, 10:25
|- - _Pasha   Цитата(ARV @ Dec 4 2008, 13:51) а как мож...   Dec 4 2008, 10:38
- - SasaVitebsk   Стоимость LCD от 3.5$ за 2х16 до 11 за 4х20. ...   Dec 4 2008, 20:56
- - delamoure   Цитата(SasaVitebsk @ Dec 4 2008, 22:56) П...   Dec 4 2008, 21:25
|- - SasaVitebsk   Цитата(delamoure @ Dec 5 2008, 01:25) В C...   Dec 4 2008, 23:39
- - Сергей Борщ   Цитата(SasaVitebsk @ Dec 4 2008, 22:56) П...   Dec 5 2008, 02:41


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 05:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.0197 секунд с 7
ELECTRONIX ©2004-2016