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.
*(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
Vous devez vous connecter pour publier un commentaire.
buffer->elements
est aussi unvoid *
si vous avez besoin de le lancer avant de pouvoir faire quelque chose avec elle:oui, c'est tout à fait correct. Les tableaux en C sont vraiment traités comme des pointeurs vers son premier élément dans la plupart des cas, de sorte que vous pouvez le convertir en un autre type de pointeur et d'obtenir le compilateur de la traiter comme si c'était un autre type de tableau.
OriginalL'auteur Chris Dodd
Bien, vous l'avez déjà fait sur le membre de GAUCHE de cette ligne:
À derefence
buffer->elements[n]
vous aurez besoin de jeter ainsi.Maintenant, la question est de savoir si ou non que le casting est correct. Je ne peux pas vous dire que vous n'avez pas de poste de l'initialisation de
buffer->elements
.OriginalL'auteur Ed S.