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

 
 
> 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, 20:56
Сообщение #2


I WANT TO BELIEVE
******

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



Ну как сказать. можно и указатели, можно и разные типы. В функции можно передавать void *, а там уже делать с ним что хочешь.

А почему не любите? Я тут как-бы может быть слегка вдохновленный возможностями Си и разошелся маленько. В общем суть такова:
Код
/*
*    Размер пакета может меняться в зависимости от настройки алгоритма(размер блока, размер поля ID(публ. ключа))
*
*    Нам нужны пакеты двух типов
*    1.ID-пакет: используется для передачи ID абонентов и ID корпорации
*    2.Block-пакет: предназначен для транспорта данных длиной в 1 блок(хэш-функция, случайная выборка)
*    Но для унификации функций обработки пакетов яввел union ba05_net_packet
*/
enum conn_stages{ public_keys_interchange, random_sample_interchange, hash_interchange };//стадии соединения
enum packetTypes{ IDPacket, BlockPacket };
//заголовок у обоих типов пакетов общий, поэтому опишем его один раз
typedef struct
{
    enum packetTypes    packetType;    
    enum conn_stages    connStageID;
    unsigned            needACK    : 1;    //сообщает приёмнику, что в ответ на этот пакет нужно обязательно отправить ACK пакет
    unsigned            ACK        : 1;    //Признак пакета подтверждения. Если ACK==1 - все остальные поля не используются(кроме crc8,естественно)    
    unsigned             crc8     : 8;
}ba05_net_pktHeader;

//этот union позволяет использовать один тип данных(ba05_net_packet) для обоих типов пакетов.
typedef union
{
    ba05_net_pktHeader    header;                //иногда нужен _только_ заголовок пакета. К нему можно удобно обратиться :)
    struct
    {
        ba05_net_pktHeader    header;
        ba05_ID                master_ID;    
        ba05_ID                slave_ID;        
        ba05_ID                slave_corpID;    
    }asIDPacket;//1.ID-пакет: используется для передачи ID абонентов и ID корпорации
    struct
    {
        ba05_net_pktHeader    header;
        ba05_blockKey        data;
    }asBlockPacket;//2.Block-пакет: предназначен для транспорта данных длиной в 1 блок
}ba05_net_packet;

enum {     BlockPacketSize = sizeof(((ba05_net_packet *)0)->asBlockPacket),
        IDPacketSize = sizeof(((ba05_net_packet *)0)->asIDPacket),
        HeaderPacketSize = sizeof(((ba05_net_packet *)0)->header) };


По-моему достаточно элегантно выходит.
Но оценить объективно свой подход бывает достаточно сложно.

Поэтому реквестирую кАменты знатоков smile.gif


--------------------
The truth is out there...
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
|- - 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 Текстовая версия Сейчас: 29th July 2025 - 18:23
Рейтинг@Mail.ru


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