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

 
 
> sizeof union, Си
sigmaN
сообщение Oct 14 2009, 19:07
Сообщение #1


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Код
typedef union
{
    int    asHeader;

    struct
    {
        int                    header;
        int                    int1;
        int                    int2;
        int                    int3;
    }asInt3;

    struct
    {
        int                    header;
        char                     array[30];
    }asArray;
}my_union;

const int asInt3_size = sizeof(my_union.asInt3); // error: expected a ")" т.е. предлагает мне сделать sizeof(my_union);

А я бы очень хотел получить размеры каждого члена(или как там правильно его назвать) юниона.

Задумка такая: одной переменной описать три разных типа пакета, отличающиеся длиной и типом поля data.
Однако первые n байт всех трёх типов пакетов одинаковы и соответствуют заголовку(header).
Отправлять планируется в зависимости от надобности либо sizeof(my_union.asHeader); либо sizeof(my_union.asInt3) либо sizeof(my_union.asArray); байтов.
Header содержит поле, описывающее тип пакета, соответственно принемающая сторона всегда будет знать как трактовать пришедший пакет, сначала проанализировав это поле по my_union.asHeader;
К тому-же иногда(для подтверждения доставки) достаточно отправить просто asHeader.

Привлекательность состоит в том, что весь union займет в памяти столько месте, сколько необходимо для самого жирного члена(sizeof(asArray)) а AsHeader будет равен asArray.header и asInt3.header - потому как по идее &my_union_var.asHeader == &my_union_var.asInt3.header == &my_union_var.asArray.header

Верно ли последнее предположение по поводу header и как взять sizeof от члена union?
Или же поступить проще и определить структуры asHeader, asInt3, asArray отдельными typedef'ами, а union просто будет:
Код
typedef union
{
    asHeader_type    asHeader;
    asInt3_type    asInt3;
    asArray_type    asArray;
}my_union;

const int asInt3_size = sizeof(asInt3_type);


P.S. Ссылочку на стандарт С99 мне подкинули, но оказалось что сходу там ответ найти бывает очень сложно. smile.gif


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
GetSmart
сообщение Oct 14 2009, 19:15
Сообщение #2


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Код
const int asInt3_size = sizeof(my_union.asInt3);

const int asInt3_size = sizeof(((my_union *)0)->asInt3);


Один из вариантов должон сработать. Проверять лень.

-------------
PS. отредактировано уже после нижестоящего поста.

Сообщение отредактировал GetSmart - Oct 14 2009, 19:50


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- sigmaN   sizeof union   Oct 14 2009, 19:07
- - sigmaN   Т.е. всё-таки рекомендуется пойти по второму пути ...   Oct 14 2009, 19:29
|- - GetSmart   Цитата(sigmaN @ Oct 15 2009, 01:29) Т.е. ...   Oct 14 2009, 19:41
- - rezident   Цитата(sigmaN @ Oct 15 2009, 01:07) Или ж...   Oct 14 2009, 19:39
- - sigmaN   Ну как сказать. можно и указатели, можно и разные ...   Oct 14 2009, 20:56
|- - zltigo   Для начала, union притянут за уши. Начните плясать...   Oct 14 2009, 21:28
- - KRS   Я бы в описаниях пакетов использовал типы с явным ...   Oct 14 2009, 21:07
- - sigmaN   Взаимодействие систем по этому протоколу будет про...   Oct 14 2009, 21:13
- - sigmaN   Отлично! Благодарю. Действительно, немножко ...   Oct 14 2009, 22:14
|- - KRS   Цитата(sigmaN @ Oct 15 2009, 02:14) Разни...   Oct 15 2009, 08:03
- - sigmaN   Понятно. Значит буду продолжать typedef. В принци...   Oct 15 2009, 08:24
|- - defunct   Цитата(sigmaN @ Oct 15 2009, 10:24) Понят...   Nov 3 2009, 23:54
|- - GetSmart   Цитата(defunct @ Nov 4 2009, 05:54) Код u...   Nov 4 2009, 21:56
|- - defunct   Цитата(GetSmart @ Nov 4 2009, 23:56) Это ...   Nov 5 2009, 01:52
- - sigmaN   Сейчас так: Кодstruct ba05_net_pktHeader { uint16...   Nov 5 2009, 23:11


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 17:42
Рейтинг@Mail.ru


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