创建通用循环缓冲区

时间:2012-11-29 02:44:56

标签: c circular-buffer

希望从内容中抽象出循环缓冲区的结构,并从以下代码段开始(由this维基百科条目提供):

typedef struct
{ 
    int value;
} ElemType;

typedef struct
{
    int         size;      /* total number of elements */
    int         start;     /* index of oldest element */
    int         count;     /* index at which to write new element  */
    ElemType   *elements;  /* vector of elements */
} CircularBuffer;

void cbInit(CircularBuffer *cb, int size) {
    cb->size  = size;
    cb->start = 0;
    cb->count = 0;
    cb->elements = (ElemType *)calloc(cb->size, sizeof(ElemType));
}

如何抽象元素类型,以便在定义CircularBuffer的实例时指定它?我到目前为止的尝试如下:

CircularBuffer *cbInit(uint16 size, void *element)
{
    CircularBuffer *buffer;

    buffer = malloc(sizeof(*buffer));

    if (buffer != NULL)
    {
        buffer->size = size;
        buffer->start = 0;
        buffer->count = 0;
        buffer->elements = (void *)calloc(size, sizeof(???));

        if (buffer->elements == NULL)
        {
            free(buffer);
            buffer = NULL;
        }
    }

    return buffer;
}

但我无法弄清楚如何确定未知类型的大小,这可能是一个int,一个结构,或介于两者之间的任何东西。我试图做的甚至可能吗?

1 个答案:

答案 0 :(得分:6)

正如您所知,您无法自动判断未知数据的大小。你需要一个固定的元素类型(void*是一个很好的通用选择),或者让用户传递每个元素的大小:

CircularBuffer *cbInit(uint16 size, int elementSize)
{
    ...
    buffer->elementSize = elementSize;
    buffer->elements    = calloc(size, elementSize);  
}