2013-03-16 5 views
5

कास्टिंग मैं एक लिंक्ड सूची में टाइप स्ट्रक्चर व्यक्ति का डेटा पास कर रहा हूं, इसलिए प्रत्येक नोड का डेटा पॉइंटर एक स्ट्रक्चर व्यक्ति को इंगित करता है।शून्य से * संरचना

struct Person { 
char name[16]; 
char text[24]; 
}; 

मैं सूची पार और पार के लिए

traverse(&list, &print); 

प्रोटोटाइप को फोन करके प्रत्येक नोड में नाम/पाठ मुद्रित करने के लिए कोशिश कर रहा हूँ है:

void traverseList(struct List *list, void (*f)(void *)); 

सूची के रूप में परिभाषित किया गया है:

struct List { 
struct Node *head; 
}; 

मेरा पी रिंट फ़ंक्शन एक शून्य * डेटा स्वीकार करता है:

print(void *data) { .... } 

मुझे पता है कि मुझे डेटा को स्ट्रक्चर व्यक्ति को सही करना है, सही?

struct Person *person = (struct Person *)data; 
printf("%s", person->name); 

मुझे पता है कि यह पर्याप्त नहीं है क्योंकि मुझे "असंगत सूचक प्रकार से प्रारंभिक" चेतावनी मिल रही है। मैं इस मामले में एक शून्य * सफलतापूर्वक कैसे डाल सकता हूं? धन्यवाद।

+0

'traverse' के प्रोटोटाइप क्या है? और किस प्रकार 'सूची' है? –

+0

आप यह जांचना चाहेंगे कि आप कैसे जा रहे हैं, और आप वास्तव में प्रिंट का उपयोग कैसे कर रहे हैं। जो कुछ भी आपने दिखाया वह सब कुछ मिल रहा है। – unxnut

+0

@ValeriAtamaniouk मैंने उन लोगों को शामिल करने के लिए अपना प्रश्न संपादित किया है। – user1889966

उत्तर

3

समस्या कलाकारों के साथ नहीं है, या यहाँ तक कि जिस तरह से साथ आप के आसपास समारोह गुजर रहे हैं । समस्या यह है कि print की आपकी घोषणा एक रिटर्न प्रकार गुम है, जिस स्थिति में int आमतौर पर माना जाता है। संकलक शिकायत कर रहा है क्योंकि आप एक की अपेक्षा कर रहे किसी फ़ंक्शन में int (*)(void*) पास कर रहे हैं।

यह ठीक करना आसान है: बस void को अपने print फ़ंक्शन घोषणा के सामने जोड़ें। देखें:

https://gist.github.com/ods94065/5178095

1

मेरे प्रिंट समारोह एक शून्य * डेटा

मैं कहूंगा, struct Person * स्वीकार करके अपनी print समारोह को फिर से लिखने स्वीकार करता है।

+0

यह क्यों मायने रखता है? सी 'शून्य * में संरचना के लिए किसी गैर-कॉन्स पॉइंटर के साथ संगत है। –

+0

सिर्फ इसलिए कि किसी भी समय कास्ट करने की आवश्यकता नहीं है। – duDE

+0

आपको अभी भी डालने की ज़रूरत है - आपको कार्य को पार करने के दौरान 'शून्य (*) (संरचना व्यक्ति *) '' 'शून्य (*) (शून्य *)' से कास्ट करने की आवश्यकता होगी। मुझे संदेह है कि यह कम पोर्टेबल सुरक्षित है, और आईएमओ यह कम सुरुचिपूर्ण है। –

0

आपका ट्रैवर्सलिस्ट फ़ंक्शन एक फ़ंक्शन पॉइंटर स्वीकार करता है (जो एक शून्य सूचक लेता है), लेकिन यह उस शून्य डेटा के लिए एक तर्क स्वीकार नहीं करता है। ऐसा लगता है यह है कि क्या आप के बाद कर रहे हैं यह है कि:

void print (void* data) 
{ 
    printf("%s", ((struct Person*)data)->name); 
} 

void traverseList (struct List *list, void(*f)(void*), void* data) 
{ 
    f(data); 
} 

तो फिर तुम फोन कर सकते हैं traverseList:

traverseList (&list, &print, &person); 
+0

मुझे लगता है कि 'प्रिंट' को 'ट्रैवर्स' आपूर्ति 'ट्रॉवर्स' रेस के 'स्ट्रक्चर लिस्ट *' तर्क का 'डेटा' सदस्य है। सूची में बाद के नोड्स। –

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