|
Как в CodeVision работает галочка"Promote char to int"? |
|
|
|
Jan 9 2011, 19:38
|
Знающий
   
Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131

|
Господа, есть вопрос. Полдня потратил на вылавливание косяка в программе.
Есть функция, которая принимает параметр типа unsigned int:
void Func(unsigned int i)
Косяк был в том, что я подставлял туда переменную типа unsigned char, умноженную на некое число. КОгда произведение unsigned char на это число не превышало 256, все было нормально, когда превышало - начинались косяки. Т.Е., не важно какого типа переменная произведения, если один из множителей unsigned char, произведение выше 256 никак не получится.
Нашлось 2 решения. Первое - сделать эту переменную типа unsigned int. Второе - поставить в настройках галочку - "promote char to int".
По последнему пункту вопрос - что все-таки делает эта галка? Преобразуетт char в int по необхоидмости, или же преобразуются все char переменные? Меня беспокоит экономия памяти, вот я и думаю - какое из приведенных решений рациональней - первое или второе?
Спасибо.
|
|
|
|
|
Jan 10 2011, 05:31
|

Знающий
   
Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768

|
Цитата(-=Женек=- @ Jan 10 2011, 01:38)  По последнему пункту вопрос - что все-таки делает эта галка? Преобразуетт char в int по необхоидмости, или же преобразуются все char переменные? Меня беспокоит экономия памяти, вот я и думаю - какое из приведенных решений рациональней - первое или второе? Эта галка заставляет компилер работать по стандарту-если в выражении встречаются и char и int переменные,то все char переменные автоматически приводятся к типу int. В вашем случае это не поможет-только первый вариант.
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
Jan 10 2011, 06:43
|
Знающий
   
Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131

|
Цитата В вашем случае это не поможет-только первый вариант. Послушайте, ну я же написал - "нашлось 2 решения", значит помогло, значит с этой галочкой работает. Или же я вас неправильно понял... Дело в том, что это решение уж очень простое и непонтно, зачем тогда вообще эту галочку нужно убирать. Я так подозреваю, что используюя галочку, а не конкретную переменную, я чем-то жертвую...
|
|
|
|
|
Jan 10 2011, 07:56
|

Знающий
   
Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768

|
Цитата(-=Женек=- @ Jan 10 2011, 12:43)  Косяк был в том, что я подставлял туда переменную типа unsigned char, умноженную на некое число. КОгда произведение unsigned char на это число не превышало 256, все было нормально, когда превышало - начинались косяки.
Послушайте, ну я же написал - "нашлось 2 решения", значит помогло, значит с этой галочкой работает. Или же я вас неправильно понял... Странно это..В случае умножения или сложения одинаковых типов следить за переполнением должен программист и опция "promote char to int" влиять вроде-бы не должна. из хэлпа CV: Checking the Promote char to int check box enables the ANSI promotion of char operands to int. To prevent overflow on 8 bit addition or multiplication, casting may be required. The compiler issues warnings in these situations. Example: void main(void) { unsigned char a=30; unsigned char b=128; unsigned int c; /* This will generate an incorrect result, because the multiplication is done on 8 bits producing an 8 bit result, which overflows. Only after the multiplication, the 8 bit result is promoted to unsigned int */ c=a*b; /* Here casting forces the multiplication to be done on 16 bits, producing an 16 bit result, without overflow */ c=(unsigned int) a*b; } практически ваш случай,если я правильно вас понимаю.
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
Jan 11 2011, 06:05
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(WHALE @ Jan 10 2011, 13:56)  Странно это..В случае умножения или сложения одинаковых типов следить за переполнением должен программист и опция "promote char to int" влиять вроде-бы не должна. Типы не одинаковые. Насколько я понял ТС умножал char на константу, а константа - это Int 2 TC: Сделайте приведение типа к int по месту: Код 5*(int)my_char_var
|
|
|
|
|
Jan 11 2011, 14:54
|
Знающий
   
Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131

|
Цитата что отрицательно скажется на размере занятого FLASH не поверите, размер снизился на 0,5%. Про скорость не знаю.... Субъективно ничего не изменилось, тесты проводить лень. Код CodeVision из топки!
forever рулёз! CodeVision хорош тем, что его просто освоить. Но... портит стиль программирования. КОгда я занялся ARM, я это понял.
|
|
|
|
|
Jan 14 2011, 19:22
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(Deka @ Jan 14 2011, 22:41)  А вот с этого места поподробнее пожалуйста! Хочу перейти на ARM и уже запасся CV, а тут такой пост... CV (Codevision) - он только для AVR бывает. Цитата И что является правильным по сравнению с CV? Для ARM много чего есть: keil, iar, realview, gcc и куча его производных...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|