Учитывая желание абстрагировать структуру циклического буфера от его содержимого и начиная со следующих сегментов кода (любезно предоставлено эта запись в Википедии):
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 или чем-то средним. Возможно ли то, что я пытаюсь сделать?