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

 
 
 
Reply to this topicStart new topic
> Codevision - переполнение переменной?, unsigned long int
Athlon128
сообщение Aug 1 2006, 09:57
Сообщение #1


Участник
*

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



Проблема такая. делаю цифровой спидометр на меге16, по прерыванию инкременирую переменную km, которая объявлена так: unsigned long int km=0;
Всё работает нормально, пока на машине не проедешь ~25км, т.е. переменная натикает ~125000, а дальше принимает отрицательное значение и далее возрастает уже из минуса. По видимому переполнение, но для unsigned long int диапазон значений от 0 до 4294967295, а она переполняется гораздо раньше, причём убегает в минус, хотя тип переменной - беззнаковое.

Может сталкивались с этой проблемой в codevisionAVR? подскажите как обойти плиз.. help.gif

ЗЫ: Смотрел memory map, там переменная занимает 4 байта как и положено для unsigned long int.
Go to the top of the page
 
+Quote Post
pokos
сообщение Aug 1 2006, 10:09
Сообщение #2


Местный
***

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



Что-то мне кажется, что дело не в переполнении переменной, а в процедуре её отображения.
Go to the top of the page
 
+Quote Post
$ilent
сообщение Aug 1 2006, 10:35
Сообщение #3


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

Группа: Новичок
Сообщений: 116
Регистрация: 14-02-06
Из: Москва. Перово
Пользователь №: 14 296



Цитата(Athlon128 @ Aug 1 2006, 13:57) *
По видимому переполнение, но для unsigned long int диапазон значений от 0 до 4294967295, а она переполняется гораздо раньше, причём убегает в минус, хотя тип переменной - беззнаковое.

А ты часом не присваеваешь ли потом значение переменной (mk) другой переменной типа signed long int???. К примеру при отображении???
Go to the top of the page
 
+Quote Post
Athlon128
сообщение Aug 1 2006, 15:22
Сообщение #4


Участник
*

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



Вывожу так:
Цитата
sprintf(lcd_buffer,"%d м",km/6);
lcd_puts(lcd_buffer);
Go to the top of the page
 
+Quote Post
pokos
сообщение Aug 1 2006, 15:30
Сообщение #5


Местный
***

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



"'d' - the function argument is a signed decimal integer;"
Go to the top of the page
 
+Quote Post
Athlon128
сообщение Aug 1 2006, 16:44
Сообщение #6


Участник
*

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



А как решить? есть буковка с % для этого случая? или делить на 10000 и выводить частное от деления и остаток отдельно?
Go to the top of the page
 
+Quote Post
at90
сообщение Aug 1 2006, 18:50
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 866
Регистрация: 31-03-05
Из: Краснодар
Пользователь №: 3 814



а в кодевижне в настройках проекта правильно стоит тип для sprintf?
Может там int или int with? а нада long


--------------------
<<Первая производная от чужой идеи - уже твоя идея.>>
Go to the top of the page
 
+Quote Post
Athlon128
сообщение Aug 1 2006, 18:55
Сообщение #8


Участник
*

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



Цитата(at90 @ Aug 2 2006, 00:50) *
а в кодевижне в настройках проекта правильно стоит тип для sprintf?
Может там int или int with? а нада long

Да действительно int width, спасибо за рекомендацию, завтра опробую wink.gif
Go to the top of the page
 
+Quote Post
pokos
сообщение Aug 2 2006, 05:19
Сообщение #9


Местный
***

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



Цитата(Athlon128 @ Aug 1 2006, 20:44) *
А как решить?

Ну, для начала неплохо бы хелпы почетать:
"'u' - the function argument is an unsigned decimal integer;"
Go to the top of the page
 
+Quote Post
Balun
сообщение Aug 2 2006, 11:59
Сообщение #10


Участник
*

Группа: Свой
Сообщений: 34
Регистрация: 26-07-06
Пользователь №: 19 098



у меня подобная проблема было только с float.
Поменял настройки и всё заработало.
Go to the top of the page
 
+Quote Post
Serj78
сообщение Aug 2 2006, 18:44
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 966
Регистрация: 27-05-06
Из: СПб
Пользователь №: 17 499



И еще - чтобы не наступать на грабли: если эта переменная делается путем присваивания ей произведения другой переменной, объявленной меньшей разрядности, , например, unsigned int на число или другую переменную, то результат не может вылезти за 256*256, то есть разрядную сетку uns.int.

то же происходит и с другими типами. при умножении типа на число или меньший тип, результат не больше разрядности типа, хоть он и присваивается он большему типу- смотри во что это компилируется, будет понятно.
Go to the top of the page
 
+Quote Post
TamTam
сообщение Aug 3 2006, 16:21
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 293
Регистрация: 14-03-06
Пользователь №: 15 254



Несовсем в тему но всеже спрошу, может у кого есть CodeVision с таблеткой из линейки 1.25
Go to the top of the page
 
+Quote Post
at90
сообщение Aug 3 2006, 18:27
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 866
Регистрация: 31-03-05
Из: Краснодар
Пользователь №: 3 814



а чем 1.24.7 не устраивает?
Есть на местном FTP


--------------------
<<Первая производная от чужой идеи - уже твоя идея.>>
Go to the top of the page
 
+Quote Post
Athlon128
сообщение Aug 3 2006, 19:50
Сообщение #14


Участник
*

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



http://phreaker.ru/download/cvavr.rar
версия 1.24.8d с кряком
Go to the top of the page
 
+Quote Post
at90
сообщение Aug 7 2006, 15:10
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 866
Регистрация: 31-03-05
Из: Краснодар
Пользователь №: 3 814



а 1.24.9 ещё не никто не видел крякнутого?


--------------------
<<Первая производная от чужой идеи - уже твоя идея.>>
Go to the top of the page
 
+Quote Post

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

 


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


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