2010-11-30 58 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; 
}