2010-11-30 93 views
0

我为一个μC编程,我具有以下数据结构:C(++)联盟的数据结构

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 ::数据’的”,为什么呢?

谢谢!

+1

数据是工会的一个typedef,不是一个变量... – 2010-11-30 12:27:48

回答

3

问题是您的typedef声明。 RF12Message :: data is not a union of 40 uint8_ts and a MessageNodeFound;它是由这些东西组成的数据类型。

类似的问题会影响您的MessageNodeFound声明。删除typedef s,我认为它应该工作。

+0

非常感谢你,现在它的作品! :) – 2010-11-30 12:32:42

0

对于C++

的typedef声明只是声明一个类型。对于这个问题,没有数据成员称为“MessageNodeFound”或“数据”。

这应该给你一个想法

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; 
}