C 创建通用循环缓冲区

C 创建通用循环缓冲区,c,circular-buffer,C,Circular Buffer,鉴于希望从内容中抽象出循环缓冲区的结构,从以下代码段开始(由wikipedia条目提供): 如何抽象元素类型,以便在定义CircularBuffer实例时指定它?到目前为止,我的努力如下: CircularBuffer *cbInit(uint16 size, void *element) { CircularBuffer *buffer; buffer = malloc(sizeof(*buffer)); if (buffer != NULL) {

鉴于希望从内容中抽象出循环缓冲区的结构,从以下代码段开始(由wikipedia条目提供):

如何抽象元素类型,以便在定义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、struct或介于两者之间的任何类型。我试图做的是可能的吗?

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

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

但是您将使用指向这些对象的指针,对吗?指针大小相同。SigeOf(Value*)这是C++模板使生活变得更容易的事情之一。在这里,您需要一个原始内存缓冲区,并从用户那里传入大小。或者完全使用指针。所讨论的代码用于在嵌入式系统上缓冲串行UART输入。我最初使用双链表实现缓冲区,但是由于每个节点的实际内容都是一个字符,因此该结构带来的开销太大。我正在寻找一个折衷方案,使代码具有足够的通用性,可以重复使用,而不会在RAM使用方面产生太多开销。如果是UART,最好只使用未设计字符(字节)的循环缓冲区。使其通用将花费你,你将永远铸造。另一种方法是为您想要的每种类型生成一个循环缓冲区,该缓冲区将存储同质元素,也就是说,它们的大小都相同。sizeof(void*)不是指向void的指针的大小吗?如果是这样的话,如果它依赖于编译器,并且与元素本身的大小无关,那么是什么使它成为一个好的泛型选择呢?你是在建议我使用一个指针数组,每个指针指向一个元素吗?@Zack是的,或者是一个指针数组,每个指针指向一个元素;也可以存储任何内容,但用户必须以电子方式传入元素大小。那两个人中的一个。
CircularBuffer *cbInit(uint16 size, int elementSize)
{
    ...
    buffer->elementSize = elementSize;
    buffer->elements    = calloc(size, elementSize);  
}