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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как в CodeVision работает галочка"Promote char to int"?
-=Женек=-
сообщение Jan 9 2011, 19:38
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 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 переменные?
Меня беспокоит экономия памяти, вот я и думаю - какое из приведенных решений рациональней - первое или второе?

Спасибо.
Go to the top of the page
 
+Quote Post
WHALE
сообщение Jan 10 2011, 05:31
Сообщение #2


Знающий
****

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



Цитата(-=Женек=- @ Jan 10 2011, 01:38) *
По последнему пункту вопрос - что все-таки делает эта галка? Преобразуетт char в int по необхоидмости, или же преобразуются все char переменные?
Меня беспокоит экономия памяти, вот я и думаю - какое из приведенных решений рациональней - первое или второе?

Эта галка заставляет компилер работать по стандарту-если в выражении встречаются и char и int переменные,то все char переменные автоматически приводятся к типу int.
В вашем случае это не поможет-только первый вариант.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
-=Женек=-
сообщение Jan 10 2011, 06:43
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131



Цитата
В вашем случае это не поможет-только первый вариант.


Послушайте, ну я же написал - "нашлось 2 решения", значит помогло, значит с этой галочкой работает.
Или же я вас неправильно понял...

Дело в том, что это решение уж очень простое и непонтно, зачем тогда вообще эту галочку нужно убирать. Я так подозреваю, что используюя галочку, а не конкретную переменную, я чем-то жертвую...
Go to the top of the page
 
+Quote Post
WHALE
сообщение Jan 10 2011, 07:56
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jan 10 2011, 09:25
Сообщение #5


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



И ещё раз скажу это: CodeVision в топку!!!! ))))


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
XVR
сообщение Jan 11 2011, 06:05
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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

Go to the top of the page
 
+Quote Post
-=Женек=-
сообщение Jan 11 2011, 14:00
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131



XVR, спасибо, но дело не в этом. ПРоблемы то не существует, есть два решения, вы просто предложили третье. Я всего лишь хотел знать - чем чревато жесткое включение приведения типов указанной галочкой.
Go to the top of the page
 
+Quote Post
XVR
сообщение Jan 11 2011, 14:25
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(-=Женек=- @ Jan 11 2011, 20:00) *
Я всего лишь хотел знать - чем чревато жесткое включение приведения типов указанной галочкой.
Тем, что CV нагенерит много лишнего кода, что отрицательно скажется на размере занятого FLASH (и может быть на скорости работы). Может отрицательно сказаться и на работоспособности, если где то 'программист' (именно так - в кавычках) заложится на 8ми битную арифметику с char

Go to the top of the page
 
+Quote Post
Lmx2315
сообщение Jan 11 2011, 14:52
Сообщение #9


отэц
*****

Группа: Свой
Сообщений: 1 729
Регистрация: 18-09-05
Из: Москва
Пользователь №: 8 684



тут обсуждали преобразование типов в CV

http://electronix.ru/forum/lofiversion/index.php/t46523.html

http://electronix.ru/forum/lofiversion/index.php/t64571.html

Цитата(sigmaN @ Jan 10 2011, 15:25) *
И ещё раз скажу это: CodeVision в топку!!!! ))))

CodeVision из топки!
forever рулёз! biggrin.gif

з.ы. с чего-то нужно начинать CV -самое то , а то можно и не дотерпеть до результата.


--------------------
b4edbc0f854dda469460aa1aa a5ba2bd36cbe9d4bc8f92179f 8f3fec5d9da7f0
SHA-256
Go to the top of the page
 
+Quote Post
-=Женек=-
сообщение Jan 11 2011, 14:54
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 559
Регистрация: 6-09-06
Пользователь №: 20 131



Цитата
что отрицательно скажется на размере занятого FLASH


не поверите, размер снизился на 0,5%. Про скорость не знаю.... Субъективно ничего не изменилось, тесты проводить лень.

Код
CodeVision из топки!

forever рулёз!


CodeVision хорош тем, что его просто освоить.

Но... портит стиль программирования. КОгда я занялся ARM, я это понял.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jan 11 2011, 18:27
Сообщение #11


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Да ладно вам, люди. Уж что что, а начинать и привыкать нужно к правильному. И тут CV может как-бы оказать медвежью услугу...


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Deka
сообщение Jan 14 2011, 16:41
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 248
Регистрация: 18-07-06
Из: Сочи
Пользователь №: 18 890



А вот с этого места поподробнее пожалуйста! Хочу перейти на ARM и уже запасся CV, а тут такой пост... И что является правильным по сравнению с CV?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 14 2011, 19:22
Сообщение #13


неотягощённый злом
******

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



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


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jan 15 2011, 07:43
Сообщение #14


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Я бы сказал, что CV использует компилятор с Си-подобного языка программирования ))
Нарушения стандарта там встречаются практически повсеместно. Привыкнув к такому компилятору - можно потом жестоко обламываться пересев на нормальный. И всё ничего - если бы был в этом какой-то реальный профит... А так...ну что там, ну чуть удобнее некоторые вещи написал/объявил... и что из этого? А ничего ) Всё то-же самое можно сделать на Си. Зато ты практикуешь реально универсальный и сильный Си, который пригодится всегда и везде, а не какой-то там кодэ вижн. Вот.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Deka
сообщение Jan 15 2011, 10:53
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 248
Регистрация: 18-07-06
Из: Сочи
Пользователь №: 18 890



Мда... Лажанулся... Прошу прощения. Читал CV, а думал почему-то про Keil.
Go to the top of the page
 
+Quote Post

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

 


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


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