2011-01-30 16 views
5

अरे दोस्तों, मैं सी के लिए नया हूँ और मेरी पहली परियोजना के लिए मुझे एक सरणी आधारित कतार लागू करने की आवश्यकता है। मैं चाहता हूं कि मेरी कतार किसी भी प्रकार की ऑब्जेक्ट को पकड़ने में सक्षम हो, इसलिए मैंने किसी भी प्रकार की ऑब्जेक्ट को शून्य पॉइंटर रखने के लिए एक क्यूईइलेमेंट स्ट्रक्चर बनाया है। मुझे लगता है कि सब कुछ काम कर रहा है सिवाय इसके कि मैं अपने कतारबद्ध संरचना से 'स्थिति' और 'मान' फ़ील्ड पढ़ने में असमर्थ हूं। संकलन करने का प्रयास करते समय मुझे निम्न त्रुटि मिलती है।सी 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; 
} 

उत्तर

6

QueueElementStruct की परिभाषा Runnable.c में दिखाई दे रहा यह के क्षेत्र तक पहुँचने के लिए सक्षम होने के लिए हो गया है। आप QueueElementStruct को ऐसे शीर्षलेख में डाल सकते हैं जिसमें आप Runnable.c और QueueElement.c में शामिल कर सकते हैं। वैकल्पिक रूप से, आप अपने GetPosition फ़ंक्शन का उपयोग कर सकते हैं और GetValue फ़ंक्शन जोड़ सकते हैं और सीधे फ़ील्ड एक्सेस के बजाय Runnable.c से उनका उपयोग कर सकते हैं।

+0

Runnable.c में Queue.h शामिल है जिसमें बदले में QueueElement.h शामिल है। क्या इस लिंकिंग में काम शामिल है? – Pooch

+1

ऐसा करता है, लेकिन QueueElement.h QueueElementStruct के सदस्यों को परिभाषित नहीं करता है, यह केवल इसके अस्तित्व का सुझाव देता है। अगर मैं QueueElement.h शामिल करता हूं तो मुझे पता है कि क्यूईएलेमेंटस्ट्रक्चर नामक एक संरचना है, न कि इसके घटक। केवल QueueElement.c जानता है कि QueueElementStruct के सदस्य क्या हैं। –

+0

लोगान, मैंने जैरी के साथ आपकी सलाह का उपयोग किया और मेरा कोड संकलित हुआ। मदद के लिए बहुत शुक्रिया दोस्तों। – Pooch

4

आपको void * को "वास्तविक" प्रकार पर वापस इंगित करने से पहले इसे अव्यवस्थित करना होगा। उदाहरण के लिए, यदि आप int से शुरू करते हैं, तो आप इसका पता ले सकते हैं, और इसे कतार में डाल सकते हैं। int को देखने के लिए, आपको इसे वापस int * पर डालना होगा। वास्तविक प्रकार का ट्रैक रखना (आमतौर पर) गैर-तुच्छ (उदाहरण के लिए, संग्रह में डालने और संग्रह में प्रत्येक आइटम को जोड़ने वाले सभी प्रकारों की गणना करना) हो सकता है।

एक कारण है कि सी ++ (एक उदाहरण के लिए) किसी भी प्रकार के ऑब्जेक्ट को किसी दिए गए संग्रह में डालने का विकल्प चुनता है।

+0

क्या मैं इसे इस पंक्ति पर एक int में वापस नहीं डालता: printf ("value:% d", (int *) (f-> मान)); – Pooch

+0

@Pooch: शायद - मुझे डर है कि मैंने सुनिश्चित करने के लिए कोड की सभी 200 (या जो भी) लाइनों के माध्यम से पता नहीं लगाया।ओटीओएच, आपकी टिप्पणी में कोड का थोड़ा सा स्पष्ट रूप से एक समस्या है - आप 'int-' में 'f-> value' कास्टिंग कर रहे हैं, लेकिन फिर इसे' printf' 'को'% d '' रूपांतरण के साथ पास कर रहे हैं, जो कि एक 'int' की अपेक्षा करता है, सूचक नहीं। शायद आप '* (int *) (f-> value) 'जैसे कुछ का इरादा रखते हैं? –

+0

धन्यवाद जेरी, आपकी कास्ट अभिव्यक्ति काम किया! – Pooch

संबंधित मुद्दे