-=Женек=- 0 9 января, 2011 Опубликовано 9 января, 2011 · Жалоба Господа, есть вопрос. Полдня потратил на вылавливание косяка в программе. Есть функция, которая принимает параметр типа 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 переменные? Меня беспокоит экономия памяти, вот я и думаю - какое из приведенных решений рациональней - первое или второе? Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
WHILE 0 10 января, 2011 Опубликовано 10 января, 2011 · Жалоба По последнему пункту вопрос - что все-таки делает эта галка? Преобразуетт char в int по необхоидмости, или же преобразуются все char переменные? Меня беспокоит экономия памяти, вот я и думаю - какое из приведенных решений рациональней - первое или второе? Эта галка заставляет компилер работать по стандарту-если в выражении встречаются и char и int переменные,то все char переменные автоматически приводятся к типу int. В вашем случае это не поможет-только первый вариант. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
-=Женек=- 0 10 января, 2011 Опубликовано 10 января, 2011 · Жалоба В вашем случае это не поможет-только первый вариант. Послушайте, ну я же написал - "нашлось 2 решения", значит помогло, значит с этой галочкой работает. Или же я вас неправильно понял... Дело в том, что это решение уж очень простое и непонтно, зачем тогда вообще эту галочку нужно убирать. Я так подозреваю, что используюя галочку, а не конкретную переменную, я чем-то жертвую... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
WHILE 0 10 января, 2011 Опубликовано 10 января, 2011 · Жалоба Косяк был в том, что я подставлял туда переменную типа 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; } практически ваш случай,если я правильно вас понимаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 10 января, 2011 Опубликовано 10 января, 2011 · Жалоба И ещё раз скажу это: CodeVision в топку!!!! )))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба Странно это..В случае умножения или сложения одинаковых типов следить за переполнением должен программист и опция "promote char to int" влиять вроде-бы не должна.Типы не одинаковые. Насколько я понял ТС умножал char на константу, а константа - это Int 2 TC: Сделайте приведение типа к int по месту: 5*(int)my_char_var Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
-=Женек=- 0 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба XVR, спасибо, но дело не в этом. ПРоблемы то не существует, есть два решения, вы просто предложили третье. Я всего лишь хотел знать - чем чревато жесткое включение приведения типов указанной галочкой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба Я всего лишь хотел знать - чем чревато жесткое включение приведения типов указанной галочкой.Тем, что CV нагенерит много лишнего кода, что отрицательно скажется на размере занятого FLASH (и может быть на скорости работы). Может отрицательно сказаться и на работоспособности, если где то 'программист' (именно так - в кавычках) заложится на 8ми битную арифметику с char Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lmx2315 2 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба тут обсуждали преобразование типов в CV http://electronix.ru/forum/lofiversion/index.php/t46523.html http://electronix.ru/forum/lofiversion/index.php/t64571.html И ещё раз скажу это: CodeVision в топку!!!! )))) CodeVision из топки! forever рулёз! з.ы. с чего-то нужно начинать CV -самое то , а то можно и не дотерпеть до результата. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
-=Женек=- 0 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба что отрицательно скажется на размере занятого FLASH не поверите, размер снизился на 0,5%. Про скорость не знаю.... Субъективно ничего не изменилось, тесты проводить лень. CodeVision из топки! forever рулёз! CodeVision хорош тем, что его просто освоить. Но... портит стиль программирования. КОгда я занялся ARM, я это понял. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба Да ладно вам, люди. Уж что что, а начинать и привыкать нужно к правильному. И тут CV может как-бы оказать медвежью услугу... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Deka 0 14 января, 2011 Опубликовано 14 января, 2011 · Жалоба А вот с этого места поподробнее пожалуйста! Хочу перейти на ARM и уже запасся CV, а тут такой пост... И что является правильным по сравнению с CV? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 14 января, 2011 Опубликовано 14 января, 2011 · Жалоба А вот с этого места поподробнее пожалуйста! Хочу перейти на ARM и уже запасся CV, а тут такой пост...CV (Codevision) - он только для AVR бывает. И что является правильным по сравнению с CV?Для ARM много чего есть: keil, iar, realview, gcc и куча его производных... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sigmaN 0 15 января, 2011 Опубликовано 15 января, 2011 · Жалоба Я бы сказал, что CV использует компилятор с Си-подобного языка программирования )) Нарушения стандарта там встречаются практически повсеместно. Привыкнув к такому компилятору - можно потом жестоко обламываться пересев на нормальный. И всё ничего - если бы был в этом какой-то реальный профит... А так...ну что там, ну чуть удобнее некоторые вещи написал/объявил... и что из этого? А ничего ) Всё то-же самое можно сделать на Си. Зато ты практикуешь реально универсальный и сильный Си, который пригодится всегда и везде, а не какой-то там кодэ вижн. Вот. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Deka 0 15 января, 2011 Опубликовано 15 января, 2011 · Жалоба Мда... Лажанулся... Прошу прощения. Читал CV, а думал почему-то про Keil. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться