3

私はネットワーク アプリケーションを構築しようとしていますが、一度に 1 つ、2 つ、または 3 つの選択肢を記述できる必要があります。以下の共用体は、構造体を 1 つしか使用していない場合でも、ネットワークに 4 文字を書き込みます。

union choice_
{
    struct one_
    {
        unsigned char one[2];
    }src;   
    struct two_
    {
        unsigned char two[2];
    }two;
    struct three
    {
        unsigned char one[2];
        unsigned char two[2];
    }three;
}choice;

ただchoice.oneと書けないのか

ここで少し混乱しています。構造体の選択を構築するにはどうすればよいですか?

4

3 に答える 3

4

共用体は、いつでも最大のメンバーを格納できる必要があるため、その最大のメンバーと同じ大きさです。この場合、struct threewhich にはそれぞれ 2 文字の配列が 2 つ含まれており、合計で 4 文字になるため、 のすべてのインスタンスはchoice4 文字の長さになります。

于 2012-04-24T05:10:42.343 に答える
3

ユニオンはまったく役に立ちませんが、むしろコードを難読化し、不要なパディング バイトが挿入される可能性を高めます。代わりに、次のようにします。

typedef struct
{
  char data[2];
} choice_t;

...

void write_bytes_to_network (const choice_t* choice);

...

choice_t one = ...;
choice_t two = ...;

switch(something)
{
  case 1: 
    write_bytes_to_network (&one);
    break;

  case 2:
    write_bytes_to_network (&two);
    break;

  case 3:
    write_bytes_to_network (&one);
    write_bytes_to_network (&two);
    break;
}
于 2012-04-24T06:24:31.427 に答える
0

あなたはできる:

union choice_ u;
...
write(<fd>, u.one, sizeof(u.one));

またはそれが2つの場合

union choice_ u;
...
write(<fd>, u.two, sizeof(u.two));

または3番目のケースでは

union choice_ u;
...
write(<fd>, u.three, sizeof(u.three));

ただし、あなたの場合sizeof(union choice_)は常に のサイズに等しいことに注意してくださいstruct three

于 2012-04-24T11:23:43.097 に答える