2017-12-20 15 views
2

私は初心者のCプレーヤーでもありません。だから私の問題です。 私はこのように宣言組合があります。ユニオンで構造体を理解するのに問題があります

typedef union 
{ 
    // 8-bit data 
    struct 
    { 
     UINT16 data8bit : 8; 
    }; 

    // 9-bit data 
    struct 
    { 
     UINT16 data9bit : 9; 
    }; 

    UINT16 __data; 
} EXAMPLE_DATA; 

をそして、このように書き機能があります:

SendData(EXAMPLE_DATA data) 
{ 
    //..... 
} 

今ここに私のquesitonですが。 私はのオブジェクトを作成して、SendData関数に渡されたとき、私のデータはdata9bit型になるようにしたいと思います。

私は本当に混乱しています。私は正直に答えを知らない。おかげさまで

+0

ちょうど 'data.data9bit = 1'またはそれと同様のものを使用してください - このようなチュートリアル(https://www.tutorialspoint.com/cprogramming/c_unions.htm)を見てください。 – hnefatl

+1

あなたがこれまでに持っていたコード*呼び出し* 'SendData'は、この質問に関連しており、その基礎のようです。しかし、あなたの質問が完全にはっきりしていないので、それはちょうど推測です。あなたが 'SendData(d)'に送られている 'EXAMPLE_DATA'型の変数' d'をいくつか持っていると仮定すると、 'd.data9bit = 257u;'は適切なメンバを設定します。 – WhozCraig

+0

@WhozCraigそれは私が探していたものでした!私は本当にこのことについてヒールで頭を上げていたので、それを知っていたはずです。ありがとう! – svemiracBago

答えて

4

これはあなたの組合のメンバーの二つが匿名構造体であるが、実際には原則的に、タイプEXAMPLE_DATAの目的は一つだけメンバーの値が含まれている、ことに変わりはないという事実によって複雑になる - に書き込まれた最後の1 - いつでも。そのメンバーは__dataか、2つの匿名構造のうちの1つです。

構造体は単なるビットフィールドのコンテナとして機能し、匿名であるため、メンバーはEXAMPLE_DATA型のメンバにアクセスするための構文でユニオン内でアクセスできます。

EXAMPLE_DATA data; 

data.data9bit = 256; 

すると、匿名の構造は表現を持っているかもしれ

  • 、ことに注意してください:あなたはEXAMPLE_DATAは現在、対応する構造のdata9bitであることを含んでいるメンバーをしたい場合はこのように、あなたはこれを行う可能性があります16ビットより大きい
  • 構造の表現内の各ビットフィールドの関連ビットの位置は、主に実装の裁量に委ねられており、特に最初の16ビット内にある必要はありません記者会見__data
  • ユニオンには、現在どのメンバーに値が入っているかを判断するための組み込みのメカニズムがないため、ユーザーはその情報を引き継ぐか、そのような情報を個別に伝達する必要があります。
0

タイプEXAMPLE_TYPEは、完全なバイトだけを格納してアドレス指定できるので、常に2バイト(つまり16ビット)になります。

の値を9ビット値として解釈しますが、サイズは常に整数のバイト数になります。

関連する問題