Dans l’espoir de mieux comprendre les réponses données dans ce message, quelqu’un peut-il m’expliquer s’il est possible de mettre en œuvre la mémoire tampon circulaire suivante, et si non, pourquoi pas.
#define CB_TYPE_CHAR 0 #define CB_TYPE_FLOAT 1 ... typedef struct CBUFF { uint16 total; /* Total number of array elements */ uint16 size; /* Size of each array element */ uint16 type; /* Array element type */ uint16 used; /* Number of array elements in use */ uint16 start; /* Array index of first unread element */ void *elements; /* Pointer to array of elements */ } CBUFF; ... void cbRead(CBUFF *buffer, void *element) { if (buffer->type == CB_TYPE_CHAR) { /* The RHS of this statement is the problem */ *(char*)element = *(buffer->elements[buffer->start]); } /* Other cases will go here */ buffer->start = (buffer->start + 1) % buffer->total; --buffer->used; }
Je comprends que le LHS doit être converti en caractères afin que je puisse déréférencer le pointeur vide. Je comprends aussi que ce fragment de code:
buffer->elements[buffer->start]
donne l’adresse de l’élément ‘buffer-> start’ du tableau elements, que je souhaite également déréférencer pour obtenir le contenu de cette adresse. Ou du moins c’est ce que je tire de K & R.
Compte tenu de tout cela, comment puis-je dire au compilateur que le contenu de la mémoire à cette adresse est un caractère et qu’il est acceptable de le déréférencer? Il y a quelque chose qui se passe ici que je ne comprends tout simplement pas.
buffer->elements
est aussi un void *
, vous devez donc le lancer avant de pouvoir faire quoi que ce soit avec:
*(char*)element = ((char *)buffer->elements)[buffer->start];
Compte tenu de tout cela, comment puis-je dire au compilateur que le contenu de la mémoire à cette adresse est un caractère et qu’il est acceptable de le déréférencer?
Eh bien, vous l’avez déjà fait sur le LHS de cette ligne:
*(char*)element = *(buffer->elements[buffer->start]);
Pour déréférencer buffer->elements[n]
vous devrez également le buffer->elements[n]
.
*(char*)element = *((char*)buffer->elements)[buffer->start];
Maintenant, la question est de savoir si ce casting est correct. Je ne peux pas vous dire cela car vous n’avez pas buffer->elements
l’initialisation de buffer->elements
.