我有一个看起来像这样的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;
但在这种情况下,我如何为阵列分配内存?我应该将它们分开,这是一个坏主意吗?
答案 0 :(得分: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
(由于有关结构联合成员的初始序列的特殊规则)。