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

 
 
 
Reply to this topicStart new topic
> Можно ли в WinAVR обозначить максимальное беззнаковое число как нибудь однообразно для переменных разного размера?
Laksus
сообщение Jan 23 2011, 00:40
Сообщение #1


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

Группа: Участник
Сообщений: 146
Регистрация: 16-05-05
Пользователь №: 5 069



Можно ли в WinAVR обозначить максимальное беззнаковое число как нибудь однообразно для переменных разного размера?
Например если
Код
uint8_t      cnt1;
uint16_t     cnt2;
uint32_t     cnt3;

то можно ли вместо
Код
if(cnt1 < 0xFF) cnt1++;
if(cnt2 < 0xFFFF) cnt2++;
if(cnt3 < 0xFFFFFFFF) cnt3++;

написать, что-то вроде
Код
if(cnt1 < MAX(cnt1)) cnt1++;
if(cnt2 < MAX(cnt2)) cnt2++;
if(cnt3 < MAX(cnt3)) cnt3++;

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

Go to the top of the page
 
+Quote Post
ae_
сообщение Jan 23 2011, 01:55
Сообщение #2


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



Может вот так?
Код
if(!(++cnt1)) cnt1--;
if(!(++cnt2)) cnt2--;
if(!(++cnt3)) cnt3--;
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Jan 23 2011, 06:11
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



или другими словами
Код
if (cnt1+1) cnt1++;


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 23 2011, 07:23
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(sensor_ua @ Jan 23 2011, 13:11) *
или другими словами
Код
if (cnt1+1) cnt1++;
Может топикстартеру это подойдет, но этот код будет выполнятся медленнее чем тот, что показал топикстартер


--------------------
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 23 2011, 08:10
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



А не проще ли так?
Код
if(cnt1 < (uint8_t)(-1)) cnt1++;
if(cnt2 < (uint16_t)(-1)) cnt2++;
if(cnt3 < (uint32_t)(-1)) cnt3++;
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jan 23 2011, 08:11
Сообщение #6


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Именно в avr-gcc ?
Тогда, на скорую руку и без проверки, не подсунули ли переменную со знаком, так;
Код
#include <stdint.h>

#define MAX(a) ((__typeof(a))-1)

uint8_t  cnt1;
uint16_t cnt2;
uint32_t cnt3;

void foo() {
        if( cnt1 < MAX(cnt1) ) ++cnt1;
        if( cnt2 < MAX(cnt2) ) ++cnt2;
        if( cnt3 < MAX(cnt3) ) ++cnt3;
}


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
SlavaG
сообщение Jan 23 2011, 17:19
Сообщение #7





Группа: Участник
Сообщений: 11
Регистрация: 14-07-06
Из: Кишинёв
Пользователь №: 18 825



А можно ещё так попробовать
Код
#define MAX(v) ((1<<(sizeof(v)*8))-1)


Сообщение отредактировал SlavaG - Jan 23 2011, 17:22
Go to the top of the page
 
+Quote Post
777777
сообщение Jan 23 2011, 17:35
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357



Цитата(prottoss @ Jan 23 2011, 10:23) *
Может топикстартеру это подойдет, но этот код будет выполнятся медленнее чем тот, что показал топикстартер

Не факт, что этот код даст то, что нужно: при выполнении операций переменные приводятся к типу int
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Jan 23 2011, 17:56
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Цитата
Не факт, что этот код даст то, что нужно: при выполнении операций переменные приводятся к типу int
Возможно, Вы правы и дополнение будет применено не к результату, а к операндам под-if-ного выражения. Лень стандарт поднимать - если вторые скобки добавить, то как? (не насчёт скорости, а насчёт результата)


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
Laksus
сообщение Jan 23 2011, 20:21
Сообщение #10


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

Группа: Участник
Сообщений: 146
Регистрация: 16-05-05
Пользователь №: 5 069



Спасибо всем ответившим, и особое спасибо ReAl.
Насколько я понял вроде бы дает код точно такой как и с разными 0xFF..., вроде бы само подставляет нужное количество разрядов. По-моему это то, что я хотел.
(Проверка на знак не нужна, только на размер, только WinAVR.)

Остальные способы по-моему не совсем то что мне нужно.
___
И еще вопрос в продолжение этой темы.
А как кто в своих реальных программах проверяет не переполнился ли счетчик.
А то может это я пытаюсь велосипед изобрести, а есть какие то устоявшиеся "стандартные" методы.

PS
Насчет "Остальные способы по-моему не совсем то что мне нужно." возможно я неправ.
#define MAX(v) ((1<<(sizeof(v)*8))-1) пока не пробовал.

Сообщение отредактировал Laksus - Jan 23 2011, 20:30
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Jan 23 2011, 21:13
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Цитата
А как кто в своих реальных программах проверяет не переполнился ли счетчик.

Чаще употребляю обратный отсчёт. Тогда
Код
if (count) count--;

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

Для расчёта задержек при "мягком риалтайме" использую разницу беззнаковых целых.
Код
clock_t clock(void);
clock_t clock_Elapsed(clock_t ts){
  clock_t tc = clock();
  return (tc - ts);
}
void pause(clock_t duration){
  clock_t ts = clock();
  while(clock_Elapsed(ts) < duration){;}
}



--------------------
aka Vit
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 24th June 2025 - 01:50
Рейтинг@Mail.ru


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