c (++) объединение Структура данных - PullRequest
0 голосов
/ 30 ноября 2010

Я программирую для микроконтроллера, у меня следующая структура данных:

typedef struct
{
  RF12Head head;

  typedef union 
  {
    uint8_t raw[40];

    typedef struct
    {
      node_id nodeId;
      uint8_t hierachyDepth;
    } MessageNodeFound;
  } data;

} RF12Message;

RF12Message содержит заголовок и часть данных. Теперь я хочу иметь разные форматы сообщений.

Я хочу иметь возможность сделать что-то вроде этого:

RF12Message msg;

memset(&msg.data.raw, 0xEF, sizeof(msg.data.raw)); // fill in directly

//or indirectly:

msg.data.MessageNodeFound.nodeId = 3;
msg.data.MessageNodeFound.hierachyDepth = 2;

но компилятор всегда выдает ошибку: «недопустимое использование« RF12Message :: data »», почему?

спасибо!

Ответы [ 3 ]

3 голосов
/ 30 ноября 2010

У вас слишком много typedef в вашем коде. Попробуйте это:

http://codepad.org/frysgQte

3 голосов
/ 30 ноября 2010

Проблема в ваших typedef заявлениях.RF12Message :: данные не a union из 40 uint8_t с и MessageNodeFound;это тип данных, состоящий из этих вещей.

Подобная проблема повлияет на ваше объявление MessageNodeFound.Удалите оба typedef s, и я думаю, что это должно работать.

0 голосов
/ 30 ноября 2010

Для C ++

Объявления typedef просто объявляют тип.В этом отношении также нет элемента данных с именем MessageNodeFound или data.

Это должно дать вам представление

typedef struct 
{ 

   typedef union  
   { 
      char raw[40]; 

      typedef struct 
      { 
         int nodeId; 
         char hierachyDepth; 
      } MessageNodeFound;

      MessageNodeFound m;

   } Data; 
   Data d;
} RF12Message;

int main(){
   RF12Message msg; 

   memset(&msg.d.raw, 0xEF, sizeof(msg.d.raw)); // fill in directly 

   //or indirectly: 

   msg.d.m.nodeId = 3; 
   msg.d.m.hierachyDepth = 2;
}
...