2012-04-24 2 views
3

네트워크 응용 프로그램을 구축하려고하는데 한 번에 하나, 두 개 또는 세 개의 선택 사항을 작성할 수 있어야합니다. 아래 구조체는 구조체 하나만 사용하더라도 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에게

을 쓸 수 없습니다, 어떻게 구조체의 선택은 만들 수 있습니까?

+0

이것은 아마도 StackOverflow로 마이그레이션 될 것이므로 여기에 계정을 설정하는 것이 좋습니다. – Caleb

+0

Lundin의 대답은 옳은 대답이지만 문제가 무엇인지 이해하는 데 도움이됩니다. 정확하게 'choice.one'을 네트워크에 쓰고 있는지 묻고 싶습니다. –

답변

4

유니언은 언제든지 가장 큰 구성원을 저장할 수 있어야하므로 가장 큰 구성원만큼 큰 유니온입니다. 이 경우 struct three에 두 개의 문자 배열 두 개가 포함되어 총 4 개의 문자가 포함되므로 choice의 인스턴스는 4 자 길이가됩니다.

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; 
} 
+0

+1 그의 문제를 해결하는 것과는 관련이 없기 때문에 노조를 해치는 유일한 해결책이라는 +1. – Neil

0

할 수 있습니다 :

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

또는이 있다면

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

또는 세 번째 경우에 두 개의

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

참고 그러나 그에서 귀하의 케이스는 항상 sizeof(union choice_)입니다. 크기는 struct three입니다.

관련 문제