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

 
 
> Гибкий размер типа данных
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, 06:45
Сообщение #2


Гуру
******

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



А что кстати дает такой тип кроме путаницы и зоопарка дефайнов?

в чем разница между


Цитата
#define MAX_EVENTS 54 //кол-во обрабатываемых событий
static flexType(u, MAX_EVENTS) x;


и

Код
typedef int8_t MY_TYPE;
static MY_TYPE x;


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

ведь если есть MAX_EVENTS, то вы ее ровно в тех местах где она используется ровно нужное число раз напишите, так же как вы напишите MY_TYPE. Меняется в одном месте в начале программы, тайпдефов будет столько сколько уникальных типов, ровно столько сколько у вас было бы дефайновых макс_евантов. В тех местах где вы размер задаете не через дефайн, а явно, можно поставить прямой тип.


Ну и опять же если все структуры и все плавает по размерам, съезжают протоколы, ИМХО только путаница....




Цитата
При написании меню мне понадобилось статически менять тип переменной. Для инициализации.

чет между объявлением и применением я не нашел корреляции %(
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Jul 31 2015, 07:51
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Golikov A. @ Jul 31 2015, 09:45) *
чет между объявлением и применением я не нашел корреляции %(

Давайте упростим.
Объявлен следующий тип:
Код
typedef union
{
  int32_t    i;
  float        f;
} variant_t;

Далее объявляется следующая переменная
Код
const variant_t        min = {.f = 1952.2};

То есть на этапе инициализации выбирается её тип.

Я не проверял что будет, если я объявлю например данную конструкцию
typedef union
{
int8_t i8;
int16_t i16;
int32_t i32;
float f;
} variant_t;

а при объявлении скажем сделаю
const variant_t min = {.i8 = 19};

Сколько будет выделено памяти?
Скорее всего будет выделено по максимуму.
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
|- - 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
- - Golikov A.   а... ну теперь понятно ну тогда вам надо просто ...   Jul 31 2015, 11:45
|- - scifi   Цитата(Golikov A. @ Jul 31 2015, 14:45) и...   Jul 31 2015, 12:42
|- - jcxz   Цитата(Golikov A. @ Jul 31 2015, 17:45) и...   Aug 1 2015, 06:03
- - Golikov A.   тогда ну это не очень понятно , макроса то никаког...   Aug 1 2015, 07:09


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

 


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


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