Un déréférencement des pointeurs void

Dans l'espoir de gagner une meilleure compréhension des réponses
donné dans cette post, quelqu'un peut-il m'expliquer si l'
suivant tampon circulaire de mise en œuvre est possible, 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 membre de GAUCHE doit être converti en char de sorte que je peux
déréférencer le pointeur void. Je comprends aussi que ce code
fragment:

buffer->elements[buffer->start]

donne l'adresse du tampon->start' élément des éléments
tableau, je tiens également à déréférencer afin d'obtenir à la
le contenu de cette adresse. Ou du moins c'est ce que je retiens 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 char, et qu'il est normal d'
déréférencement d'elle? Il se passe quelque chose ici, je n'ai juste pas
comprendre.

Ce code ne compile pas, n'est ce pas? Le *(buffer->elements[buffer->start]) est un déréférencement d'un void*.
Qu'est ce que sa question est en ce qui concerne. Je pense qu'il a tiré sur le côté gauche de K&R sans bien comprendre ce qu'il fait.
Zack, est le "type" de votre générique tampon fixe une fois qu'il est initialisé et allouées? Si oui, vous peut-être bien servi avec une union de différents types de pointeur de renoncer à tous le pointeur de la coulée.
C'est une excellente idée - je n'ai jamais eu à utiliser une union avant, et avait oublié. Je ferais mieux d'aller faire un peu de lecture - merci pour la suggestion!

OriginalL'auteur Zack | 2012-12-04