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

 
 
> 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
Ответов
sigmaN
сообщение Oct 14 2009, 22:14
Сообщение #2


I WANT TO BELIEVE
******

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



Отлично!
Благодарю.

Действительно, немножко не с той стороны подошел smile.gif

Хорошо.
Тут вот более глубоко задумался над typedef....
видимо ещё паскалевский стиль мышления заставляет воспринемать структуру как новый тип данных(ну и, естественно, сразу в голову приходит typedef)

Так вот, собственно, так-же известно, что ту-же структуру можно определить без typedef, а потом точно так-же определять структурные переменные.
Вопрос в том, чем отличается
Цитата
struct my_struct
{
int field1;
int fieeld2;
};
//а потом
my_struct my_struct_var;
от
Цитата
typedef struct
{
int field1;
int fieeld2;
}my_struct;
//а потом
my_struct my_struct_var;

Разница ведь только в области видимости?
т.е. typedef действительно глобальный, а тег структуры(при объявлении по первому методу) будет иметь область видимости ограниченную файлом.
Я ничего не упустил?
А то наплодил typedef а теперь вот задумался, что может быть абсолютно напрасно smile.gif


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
KRS
сообщение Oct 15 2009, 08:03
Сообщение #3


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

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(sigmaN @ Oct 15 2009, 02:14) *
Разница ведь только в области видимости?

Если вы используете С++ то разницы нет!
А если С, то при каждом объявлении надо будет писать:
struct my_struct my_struct_var;
вот что бы не писать слово struct каждый раз и используют typedef.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- sigmaN   sizeof union   Oct 14 2009, 19:07
- - GetSmart   Кодconst int asInt3_size = sizeof(my_union.asI...   Oct 14 2009, 19:15
- - 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   Понятно. Значит буду продолжать 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 - 18:57
Рейтинг@Mail.ru


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