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

 
 
> Гибкий размер типа данных
jcxz
сообщение Jul 29 2015, 05:33
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Не знаю в какой раздел форума написать, пишу сюда.
Хочется иметь тип данных гибкого размера, с размером, зависящим от значения некоего define.
Т.е. - например:
VAL_X_MAX - максимальное значение, которое может принимать некоторая переменная x.
если: 0 <= VAL_X_MAX < 256, то переменная x должна объявиться размером == байт;
если: 256 <= VAL_X_MAX < 32768, то переменная x должна объявиться размером == 16 бит;
и т.п.

Попытался сделать что-то типа:
Код
#define u8pVOID  u8
#define u16pVOID u16
#define u32pVOID u32
#define u64pVOID u64
#define s8pVOID  s8
#define s16pVOID s16
#define s32pVOID s32
#define s64pVOID s64
#define flexType_subst3(x) x
#define flexType_subst2(x) flexType_subst3(x)
#define flexType_subst(prefix, maxVal, suffix, ...) \
  flexType_subst2(                                  \
  ((maxVal) < B8) ? prefix##8##suffix:   \
  ((maxVal) < B16) ? prefix##16##suffix: \
  ((maxVal) < B32) ? prefix##32##suffix: prefix##64##suffix))
#define flexType(...) flexType_subst(__VA_ARGS__, pVOID)

чтобы можно было объявить переменную:
static flexType(u, 54) x;
где: 54 - макс. значение которое может принимать x
Но препроцессор упорно не хочет полностью вычислять выражение и доводить его до u8 crying.gif
останавливается на:
static ((54) < 0x00000100) ? u8: ((54) < 0x00010000) ? u16: ((54) < B32) ? u32: u64) x;

Интересно - есть-ли какие другие способы?
Конечно можно с помощью #if/#else/#endif, но эту конструкцию придётся городить для каждой такой переменной, а хотелось бы 1 раз определить макрос, а потом его использовать, записывая объявления кратко.

ЗЫ: Компилятор - IAR for ARM 7.20.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Golikov A.
сообщение Jul 31 2015, 11:45
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



а... ну теперь понятно

ну тогда вам надо просто написать 4 #if else и все
типов то всего
8, 16, 32, 64 бита

определяете
#define MAX_EVENTS 54

и через #if ....#else от значения MAX_EVENTS
определяете typdef или #define если тот закривляется

Код
#if MAX_EVENTS > 0x0FFFFFFFF
  #define my_type uint64_t
#else if MAX_EVENTS > 0x0FFFF
  #define my_type uint32_t
#else if MAX_EVENTS > 0x0FF
  #define my_type uint16_t
#else
  #define my_type uint8_t



этот громоздкий файл можно положить отдельно, он автоматом переобъявит типы и все получится как вы хотели, в программе тип будет всегда один и не изменный

my_type x;
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 1 2015, 06:03
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Golikov A. @ Jul 31 2015, 17:45) *
и через #if ....#else от значения MAX_EVENTS
определяете typdef или #define если тот закривляется

Ну это понятно. Я о таком ещё в 16-м сообщении писал (вариант 1).
Вот если-бы си позволял конструкцию #if/#endif в макрос запихнуть! sad.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- jcxz   Гибкий размер типа данных   Jul 29 2015, 05:33
- - scifi   Цитата(jcxz @ Jul 29 2015, 08:33) чтобы м...   Jul 29 2015, 05:48
|- - jcxz   Цитата(scifi @ Jul 29 2015, 11:48) Что за...   Jul 29 2015, 07:05
|- - scifi   Цитата(jcxz @ Jul 29 2015, 10:05) Чтобы п...   Jul 29 2015, 07:15
|- - jcxz   Цитата(scifi @ Jul 29 2015, 13:15) Если х...   Jul 29 2015, 08:05
|- - AHTOXA   На c++ это делается просто. Вот ссылка по теме. (Т...   Jul 29 2015, 10:01
- - dxp   На плюсах можно копать в сторону templates и trait...   Jul 29 2015, 13:59
|- - jcxz   Цитата(dxp @ Jul 29 2015, 19:59) На плюса...   Jul 31 2015, 02:36
- - Golikov A.   напишите свой препроцессор, который перед билдом б...   Jul 31 2015, 05:36
|- - jcxz   Цитата(Golikov A. @ Jul 31 2015, 11:36) н...   Jul 31 2015, 10:14
- - SasaVitebsk   При написании меню мне понадобилось статически мен...   Jul 31 2015, 05:46
- - Golikov A.   А что кстати дает такой тип кроме путаницы и зоопа...   Jul 31 2015, 06:45
|- - SasaVitebsk   Цитата(Golikov A. @ Jul 31 2015, 09:45) ч...   Jul 31 2015, 07:51
|- - jcxz   Цитата(SasaVitebsk @ Jul 31 2015, 13:51) ...   Jul 31 2015, 11:17
- - Golikov A.   понятно, ну тогда можно и так char AbstractData[8...   Jul 31 2015, 08:22
|- - Сергей Борщ   Цитата(Golikov A. @ Jul 31 2015, 11:22) п...   Jul 31 2015, 10:28
|- - jcxz   Цитата(Golikov A. @ Jul 31 2015, 14:22) к...   Jul 31 2015, 10:45
- - Golikov A.   ЦитатаТяжелое ассемблерное детство... Union будет ...   Jul 31 2015, 11:05
|- - scifi   Цитата(Golikov A. @ Jul 31 2015, 14:45) и...   Jul 31 2015, 12:42
- - Golikov A.   тогда ну это не очень понятно , макроса то никаког...   Aug 1 2015, 07:09


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

 


RSS Текстовая версия Сейчас: 20th August 2025 - 07:23
Рейтинг@Mail.ru


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