gpt4 book ai didi

创建通用循环缓冲区

转载 作者:太空狗 更新时间:2023-10-29 15:27:04 27 4
gpt4 key购买 nike

鉴于希望从其内容中抽象出循环缓冲区的结构,并从以下代码段开始(由 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、struct 或介于两者之间的任何类型。我尝试做的事情是否可行?

最佳答案

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

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

关于创建通用循环缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13618012/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com