Création d’un tampon circulaire générique

Compte tenu de la volonté d’extraire de son contenu la structure d’un tampon circulaire, à partir des segments de code suivants (avec la permission de cette entrée wikipedia):

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)); } 

Comment résume-t-il le type d’élément pour qu’il soit spécifié lorsqu’une instance de CircularBuffer est définie? Ma tentative jusqu’à présent est la suivante:

 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; } 

Mais je ne peux pas comprendre comment déterminer la taille d’un type inconnu, qui peut être un entier, une structure ou tout autre élément intermédiaire. Est-ce que ce que je tente de faire est même possible?

Comme vous l’avez découvert, vous ne pouvez pas indiquer automatiquement la taille d’une donnée inconnue. Vous aurez besoin soit d’un type d’élément fixe ( void* serait un bon choix générique), soit de demander à l’utilisateur d’indiquer la taille de chaque élément:

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