अरे दोस्तों, मैं सी के लिए नया हूँ और मेरी पहली परियोजना के लिए मुझे एक सरणी आधारित कतार लागू करने की आवश्यकता है। मैं चाहता हूं कि मेरी कतार किसी भी प्रकार की ऑब्जेक्ट को पकड़ने में सक्षम हो, इसलिए मैंने किसी भी प्रकार की ऑब्जेक्ट को शून्य पॉइंटर रखने के लिए एक क्यूईइलेमेंट स्ट्रक्चर बनाया है। मुझे लगता है कि सब कुछ काम कर रहा है सिवाय इसके कि मैं अपने कतारबद्ध संरचना से 'स्थिति' और 'मान' फ़ील्ड पढ़ने में असमर्थ हूं। संकलन करने का प्रयास करते समय मुझे निम्न त्रुटि मिलती है।सी Dereference शून्य * सूचक
त्रुटि:
Runnable.c: In function `main':
Runnable.c:10: error: dereferencing pointer to incomplete type
Runnable.c:11: error: dereferencing pointer to incomplete type
मैं बहुत यकीन है कि मैं सिर्फ ठीक से कास्टिंग नहीं कर रहा हूँ कर रहा हूँ। किसी भी मदद की सराहना की है।
धन्यवाद फिर से, पूच
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 में Queue.h शामिल है जिसमें बदले में QueueElement.h शामिल है। क्या इस लिंकिंग में काम शामिल है? – Pooch
ऐसा करता है, लेकिन QueueElement.h QueueElementStruct के सदस्यों को परिभाषित नहीं करता है, यह केवल इसके अस्तित्व का सुझाव देता है। अगर मैं QueueElement.h शामिल करता हूं तो मुझे पता है कि क्यूईएलेमेंटस्ट्रक्चर नामक एक संरचना है, न कि इसके घटक। केवल QueueElement.c जानता है कि QueueElementStruct के सदस्य क्या हैं। –
लोगान, मैंने जैरी के साथ आपकी सलाह का उपयोग किया और मेरा कोड संकलित हुआ। मदद के लिए बहुत शुक्रिया दोस्तों। – Pooch