2011-11-21 1 views
2

를 할당 조합 사용. 이벤트 값은 EventPointer의 배열이며 이벤트 중 하나를 큐에서 제거하기 위해 X 시간마다 이동합니다. 그것은C -이이</p> <pre><code>typedef struct event_queue{ Event* event; int size; int front; int count; int delay; } event_queue; </code></pre> <p>이것은 기본적인 순환 큐처럼 보이는 C 구조를 갖는 메모리

p->event = calloc(p->size, sizeof(Event)); 

것처럼 초기화 것, 내가 유사한 이벤트하지만 약간 다른 데이터와 다른 유형을 큐에, 유사한 기능으로, 비슷한 큐를하고 싶어한다. 처음에는 별개의 대기열을 가지고 별도로 트래버스하려고했지만 기능이 너무 반복되어서 잘못 처리 한 것처럼 보입니다. "자매"대기열이 정확히 같지만 "이벤트"의 다른 유형에 대한 포인터가 있다고 가정하십시오.

대신이 조합을 사용해야합니까? 같은

typedef struct event_queue{ 
union{ 
    Event* event; 
    VisualEvent* visual; 
} data; 
unsigned char* datatype; //array of same size as data for every individual member 
int size; 
int front; 
int count; 
int delay; 
} event_queue; 

그러나이 경우에

로, 어떻게 배열을위한 메모리를 할당 할 수 있습니까? 나는 그들을 분리시켜야 하는가? 이것은 나쁜 생각이다.

enum EEventType { TypeOne, TypeTwo }; 

typedef struct EventTag_ 
{ 
    EEventType tag; 
} EventTag; 

typedef struct EventOne_ 
{ 
    EEventType tag; 
    // real data for this event type; 
} EventOne; 

typedef struct EventTwo_ 
{ 
    EEventType tag; 
    // real data for the sister event type; 
} EventTwo; 

typedef union Event_ 
{ 
    EventTag kind; 
    EventOne event1; 
    EventTwo event2; 
} Event; 

지금 Event의 배열을 만들 :

답변

3

한 가지 해결책은 아마도 하나의 태그 기본 이벤트 입력 한 union을 만드는 것입니다. Event * p마다 (구조체 조합 멤버의 초기 시퀀스와 관련된 특별 규칙 덕분에) 어느 순간에 활성화 된 공용 멤버가 무엇이든 관계없이 e->kind.tag을 검사 할 수 있습니다.

+0

오, 나는 심각하게 생각하지 않았습니다. 나는 그것을 지금 시도 할 것이다! –

+0

죄송합니다, 나는 최종 조합에 약간 잘못이 있다고 생각합니다. 나는 이제 괜찮다고 생각한다. 대안으로, 당신은'Event'를'struct {EEventType tag; 노동 조합 {EventOne e1; EventTwo e2; }};' –