Hé les gars, je suis nouveau en C et pour mon premier projet j'ai besoin d'implémenter une file d'attente basée sur un tableau. Je souhaite que ma file d'attente puisse contenir n'importe quel type d'objet. J'ai donc créé une structure QueueElement pour contenir un pointeur vide vers un objet de n'importe quel type. Je pense que tout fonctionne, sauf que je suis incapable de lire les champs 'position' et 'value' de ma structure QueueElement. Je reçois l'erreur suivante lorsque j'essaie de compiler.C Déréférence void * pointer
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 sûr que je ne suis pas coulée correctement. Toute aide est appréciée.
Merci encore, Pooch
Runnable.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;
}
Queue.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
Queue.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;
}
Runnable.c inclut Queue.h qui inclut à son tour QueueElement.h Cette liaison de includes fonctionne-t-elle? – Pooch
Il le fait, mais QueueElement.h ne dit pas définir les membres de QueueElementStruct, il suggère simplement son existence. Si j'inclue QueueElement.h tout ce que je sais c'est qu'il y a une structure nommée QueueElementStruct, pas ses constituants. Seul QueueElement.c sait ce que sont les membres de QueueElementStruct. –
Logan, j'ai utilisé tes conseils avec Jerry's et mon code compilé. Merci pour l'aide les gars. – Pooch