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

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


Гуру
******

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



понятно, ну тогда можно и так

char AbstractData[8];

*((int *)AbstractData) = 10;
*((float *)AbstractData) = 15.43;
*((char *)AbstractData) = 'a';

как я понимаю все метания автора не выделить памяти больше чем надо, А то так все можно было лонгами покрыть и всех делов....


кстати вот здесь
Цитата
const variant_t min = {.i8 = 19};

интересный вопрос что будет если обратиться к ней потом по неправильному полю...

такого рода заморочки в структурах надо конечно через void * решать. делать указатель воид, и по какому то признаку правильно к нему обращаться,а юнионы тут излишни ИМХО
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 31 2015, 10:28
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Golikov A. @ Jul 31 2015, 11:22) *
понятно, ну тогда можно и так


char AbstractData[8];

*((int *)AbstractData) = 10;
*((float *)AbstractData) = 15.43;
*((char *)AbstractData) = 'a';
И во-первых огрести все проблемы с выравниванием на отличных от AVR архитектурах, а во-вторых - загадить исходник явными приведениями типов. Тяжелое ассемблерное детство...
Цитата(Golikov A. @ Jul 31 2015, 11:22) *
такого рода заморочки в структурах надо конечно через void * решать.
Почему именно так? Чем это лучше варианта с union (намекаю на выравнивание и загаживание исходников явными приведениями)? А если надо хранить uint64_t, когда указатель на void занимает 32 бита?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
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
|- - 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 Текстовая версия Сейчас: 30th July 2025 - 04:37
Рейтинг@Mail.ru


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