C Déréférencement de pointeur void*
Hé les gars, je suis nouveau sur C et pour mon premier projet, j'ai besoin de mettre en œuvre un tableau en fonction de la file d'attente.
Je veux que ma file d'attente pour être en mesure de contenir toute sorte d'objet j'ai donc créé un QueueElement structure pour organiser un vide pointeur vers un objet de type quelconque. Je pense que tout fonctionne, sauf que je suis incapable de lire la "position" et "valeur" des champs de mon QueueElement struct. J'obtiens l'erreur suivante lorsque j'essaie de compiler.
Erreur:
Runnable.c: In function `main':
Runnable.c:10: error: dereferencing pointer to incomplete type
Runnable.c:11: error: dereferencing pointer to incomplete type
Je suis assez sûr que je ne suis pas de la coulée correctement. Toute aide est appréciée.
Merci encore,
Toutou
Praticable.c
#include <stdio.h>
#include "Queue.h"
int main(void) {
int i = 9;
Queue q = CreateQueue();
QueueElement e = CreateQueueElement(&i);
Enqueue(q, e);
QueueElement f = Dequeue(q);
/* PROBLEM IS HERE */
printf("position: %d", f->position);
printf("value: %d", (int *)(f->value));
DestroyQueue(q);
return 0;
}
File d'attente.h
#ifndef QUEUE_H
#define QUEUE_H
#include "QueueElement.h"
typedef struct QueueStruct *Queue;
Queue CreateQueue(void);
void DestroyQueue(Queue q);
void Enqueue(Queue q, QueueElement e);
QueueElement Dequeue(Queue q);
#endif
File d'attente.c
#include "QueueElement.h"
#include "Queue.h"
#define QUEUE_SIZE 10
struct QueueStruct {
QueueElement contents[QUEUE_SIZE];
int size;
};
Queue CreateQueue(void) {
Queue q = malloc(sizeof(struct QueueStruct));
q->size = 0;
return q;
}
void DestroyQueue(Queue q) {
int i;
for(i = 0; i < q->size; i++) {
free(q->contents[i]);
}
free(q);
}
void Enqueue(Queue q, QueueElement e) {
if (q->size < QUEUE_SIZE) {
q->contents[q->size++] = e;
}
}
QueueElement Dequeue(Queue q) {
if (q->size > 0) {
return q->contents[--q->size];
}
return;
}
QueueElement.h
#ifndef QUEUE_ELEMENT_H
#define QUEUE_ELEMENT_H
typedef struct QueueElementStruct *QueueElement;
QueueElement CreateQueueElement(void *v);
void DestroyQueueElement(QueueElement e);
int GetPosition(QueueElement e);
#endif
QueueElement.c
#include <stdio.h>
#include "QueueElement.h"
struct QueueElementStruct {
int position;
void *value;
};
QueueElement CreateQueueElement(void *v) {
QueueElement e = malloc(sizeof(struct QueueElementStruct));
e->position = 0;
e->value = v;
return e;
}
void DestroyQueueElement(QueueElement e) {
free(e);
}
int GetPosition(QueueElement e) {
return e->position;
}
OriginalL'auteur Pooch | 2011-01-30
Vous devez vous connecter pour publier un commentaire.
La définition de
QueueElementStruct
doit être visible dans l'Exécutable.c pour être en mesure d'accéder aux champs. Vous pouvez mettreQueueElementStruct
dans un en-tête que vous pouvez inclure dansRunnable.c
etQueueElement.c
. Alternativement, vous pouvez utiliser votreGetPosition
fonction et ajouter unGetValue
la fonction et l'utilisation de ceux deRunnable.c
place de l'accès direct.Il n', mais QueueElement.h ne veut pas dire définir les membres de QueueElementStruct, il suggère simplement son existence. Si je comprend QueueElement.h tout ce que je sais est qu'il existe une structure nommée QueueElementStruct, pas de ses mandants. Seulement QueueElement.c sait ce que les membres de QueueElementStruct sont.
Logan, j'ai utilisé vos conseils avec Jerry et mon code compilé. Merci pour l'aide les gars.
OriginalL'auteur Logan Capaldo
Vous devez lancer le
void *
de revenir au point au type "réel" avant de déréférencement. par exemple, si vous démarrez avec uneint
, vous pouvez prendre à son adresse, et de le mettre dans la file d'attente. Regarder leint
, vous aurez à le jeter en arrière pourint *
. Garder la trace du réel peut être de type (généralement) non-trivial (par exemple, la création d'une énumération de tous les types que vous voulez être en mesure de mettre à la collecte et à l'associer à un de ceux avec chaque élément de la collection).Il ya une raison que C++ (pour un exemple) opte pour seulement mettre un type d'objet dans une collection donnée.
Peut-être -- je crains que je n'ai pas de trace à travers tous les 200 (ou autre) de lignes de code pour être sûr. Otoh, que, le bout de code dans votre commentaire a clairement un problème: vous êtes à la coulée
f->value
àint *
, mais ensuite le passant àprintf
avec un"%d"
de conversion, qui s'attend à uneint
, pas un pointeur. Peut-être que vous avez prévu quelque chose comme*(int *)(f->value)
?Merci Jerry, votre expression cast travaillé!
OriginalL'auteur Jerry Coffin