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

A 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で、変数ではないあなたのアイデアを与える必要があります... –

答えて

3

問題はtypedefです。 RF12Message :: dataはではなく、 a unionは40 uint8_tsであり、MessageNodeFoundです。それらのものからなるデータ型です。

同様の問題は、MessageNodeFoundの宣言に影響します。 typedefの両方を削除してください。うまくいくはずです。

+0

はどうもありがとうございました、今では動作します! :) –

0

: これを試してみてください。この問題についても、「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; 
} 
関連する問題