Как я могу получить доступ к внутренним членам профсоюза? - PullRequest
1 голос
/ 13 мая 2009

У меня есть объединение, которое определяется так:

typedef union {
  enum {
    REVISION = 0,
    CURRENT_VERSION = REVISION
  };

  enum FLAGS{
    FLAG_DEFAULT               = 0x00000000,
    FLAG_EOD                   = 0x00000001,
    FLAG_OUTOFORDER            = 0x00000002
  };

  CHAR _filler[32];

  struct INTERNAL_STRUCTURE {
    UINT16 type;
    UINT16 flags;
  };
}CORRHDR

Как получить доступ к элементу INTERNAL_STRUCTURE из моего кода?

Я думал, что смогу просто сделать это:

CORRHDR hdr;
hdr.INTERNAL_STRUCTURE.type = 1;

Я не прав. Я могу видеть списки в союзе, но больше ничего. Может ли кто-нибудь объяснить мне структуру (или пользу) этого типа?

Ответы [ 4 ]

5 голосов
/ 13 мая 2009

Вы объявили тип с именем INTERNAL_STRUCTURE, но не фактический экземпляр этого типа. Попробуйте это:

typedef union {
  //...
  CHAR _filler[32];
  struct {
    UINT16 type;
    UINT16 flags;
  } INTERNAL_STRUCTURE;
}CORRHDR;

Затем для доступа к полю:

CORRHDR ch;
printf("%u\n", ch.INTERNAL_STRUCTURE.type);
1 голос
/ 13 мая 2009

Вам нужно определить объект типа INTERNAL_STRUCTURE, прежде чем вы сможете попытаться получить к нему доступ. Ваш союз на данный момент не имеет. Попробуйте:

struct INTERNAL_STRUCTURE {
    UINT16 type;
    UINT16 flags;
  };
struct INTERNAL_STRUCTURE is;

...

0 голосов
/ 13 мая 2009

Кроме того, вы определяете свою структуру, но не используете ее!

Вам необходимо определить переменную этого типа структуры:

union Blob
{
  CHAR _filler[32];

  struct INTERNAL_STRUCTURE {
    UINT16 type;
    UINT16 flags;
  } myStruct;
};

CORRHDR hdr;
hdr.myStruct.type = 1;
0 голосов
/ 13 мая 2009

Вы определили тип с именем INTERNAL_STUCTURE

не экземпляр с именем INTERNAL_STRUCTURE.

typedef union {
  enum {
    REVISION = 0,
    CURRENT_VERSION = REVISION
  };

  enum FLAGS{
    FLAG_DEFAULT               = 0x00000000,
    FLAG_EOD                   = 0x00000001,
    FLAG_OUTOFORDER            = 0x00000002
  };

  CHAR _filler[32];

  struct {
    UINT16 type;
    UINT16 flags;
  } INTERNAL_STRUCTURE;
}CORRHDR;
...