2011-11-21 42 views
2

我有一个C结构,看起来像这样Ç - 使用工会,分配内存

typedef struct event_queue{ 
Event* event; 
int size; 
int front; 
int count; 
int delay; 
} event_queue; 

这是一个基本的循环队列。事件值是一个EventPointers数组,每X次遍历一次事件。 它初始化像

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; 

但是在这种情况下,我该如何为阵列分配内存?我应该让他们分开吗,这是一个坏主意?

回答

3

一种解决方案是使基本事件类型的union,或许一个标记之一:

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秒的阵列。对于每个Event * p,无论当时哪个联合成员处于活动状态(感谢关于结构联合成员的初始序列的特殊规则),都可以检查e->kind.tag

+0

哦,我真的没有想到这一点。我会马上尝试! –

+0

对不起,我想我最后的联盟有点错了。我想现在没问题。作为替代方法,您可以将'Event'设为'struct {EEventType标签;联盟{EventOne e1; EventTwo e2; }};' –