2016-05-25 5 views
0

LCDヒータッチディスプレイパラレルポート接続をモデル化しています(興味のあるHD44780、4ビットモード用)。私は1に整列していても、この連合が2バイトを占める理由

アラインメントが1に設定されていても、このユニオンは引き続き2バイトを占有します。私がmsnibble構造体を取り除くと(db4をdb7に直接結合体内の構造体に置く)、それは1バイトを占有します。構造体が共用体内にある場合、構造体は1バイト未満を取ることができますか? 2バイトは、1バイトにニブル(有効ビット、rsビット、2つの空白ビット)を加えて、サイズが2バイトになるというmsnibbleの結果ですか?

ここでコードは次のとおりです。

#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 

typedef uint8_t byte_t;//could have used char 

#pragma pack(push,1) 
typedef union 
{ 
    byte_t whole_port :8; 
    struct 
    { 
     byte_t enable  :1; 
     byte_t rs   :1; 
     byte_t    :1; 
     byte_t    :1; 
     struct 
     { 
      byte_t db4   :1; 
      byte_t db5   :1; 
      byte_t db6   :1; 
      byte_t db7   :1; 
     }msnibble; 

    }; 
} para_port_t; 
#pragma pack(pop) 

int main(int argc, char** argv) { 
    printf("%u\n",sizeof(para_port_t)); 
    return (EXIT_SUCCESS); 
} 

私はgccでコンパイルするのUbuntuでのNetBeansから働いています。プラグマはコンパイラディレクティブなので、私はそれがMicrosoft Visual Studioで同じかどうかを知りたがっていますか?

+0

'typedef uint8_t byte_t; // char'〜を使用した場合、 'unsigned char'を使用する可能性があります。 –

+0

私はここで何か愚かなことをしようとしていると思う:http://stackoverflow.com/q/11326460/1566187 – Elyasin

+1

'1バイトにニブルを加えたmsnibbleの結果である2バイトですか(イネーブルビット、rsビットと2つの空白ビット)、サイズ2バイトを作る?はい、私は標準を参照することはできませんが、この内部構造体は追加のバイトを使用するように見えます –

答えて

0

MSVCにユニオンの2バイトがあるかどうか尋ねられます。

あなたの組合にはstructというネストされた1つのバリアントがstruct以内に含まれています。どのように1バイトにすることができますか?組合がなければ、

#pragma pack(push,1) 

typedef struct { 
    byte_t enable  :1; 
    byte_t rs   :1; 
    byte_t    :1; 
    byte_t    :1; 
    struct 
    { 
     byte_t db4   :1; 
     byte_t db5   :1; 
     byte_t db6   :1; 
     byte_t db7   :1; 
    }msnibble; 
} thatstruct; 

#pragma pack(pop) 

のサイズは2です。ネストされた構造体は1バイトにパックできるとはどこですか?

-1

構造体がユニオン内にある場合、構造体は1バイト未満を取ることができますか?

いいえ。入れ子になったstructは1バイト、外側はstructが2バイトに丸められます。

関連する問題