2012-05-26 33 views
6

मैं सी में बहुत नया हूं और सभी पॉइंटर सामानों में कुछ समस्याएं हैं।टाइपपीफ स्ट्रक्चर पॉइंटर परिभाषा

मैं इस कोड लिखा है:

typedef struct edgeitem 
{ 
    double   weight; 
}EDGE_ITEM, *pEDGE_ITEM; //also declaration of a pointer 

/************ edge that includes a pointer to the edge item, next and prev ******/ 
typedef struct edge 
{ 
    pEDGE_ITEM *edge_item; 
    pEDGE  *next;  //pointer to next edge 
    pEDGE  *prev;  //pointer to prev edge 
}EDGE, *pEDGE; 

मैं एक त्रुटि इस तरह से मिलता है और सिर्फ नहीं कर सकते क्यों।

मुझे पता है कि edgeitem और edge टैग हैं और मैं struct edge *next का उपयोग कर सकता हूं लेकिन मैंने पॉइंटर्स घोषित किए हैं तो मैं उनका उपयोग कैसे नहीं कर सकता?

क्या मुझे एक सूचक होने पर * उपयोग करने की आवश्यकता है?

pEDGE_ITEM *edge_item 
//or 
pEDGE_ITEM edge_item 

मैं समझ नहीं पा रहा हूं, यह एक सूचक है तो मैं * क्यों जोड़ूं?

और आखिरी सवाल यह है:

*EDGE next 
EDGE *next 

और पिछले एक: अगर मैं ऊपर का उपयोग कर रहा है, क्या बीच का अंतर है अगर मैं जोड़ रहा:

typedef struct edge_list 
{ 
    EDGE  *head; 
}EDGE_LIST; 

है यह वही है:

pEDGE  head; 
+5

आमतौर पर टाइपिफ़ के पीछे '*' को छिपाने के लिए यह सामान्य रूप से खराब शैली है। यह केवल भ्रम पैदा कर सकता है। प्रोग्रामर पढ़ते हैं * चीजिंग से तेज चीज। यह अन्य वाक्यविन्यास तत्वों के लिए भी जाता है, जैसे '# परिभाषित करें &&&, et cetera। संक्षेप में: ऐसा मत करो। – wildplasser

उत्तर

10

आप निश्चित रूप से पेज का उपयोग नहीं कर सकते संरचना के आयन।

typedef struct edge { 
    pEDGE_ITEM   *edge_item; 
    struct edge   *next;  //pointer to next edge 
    struct edge   *prev;  //pointer to prev edge 
} EDGE, *pEDGE; 

आप यह भी ध्यान रखें चाहिए कि edge_item एक डबल सूचक है: आप की तरह कुछ करना shoud। आप अपने प्रश्न में भी उल्लेख करते हैं। तो यदि आप pEDGE_ITEM का उपयोग करते हैं और आप बस एक सामान्य सूचक होना चाहते हैं तो आपको pEDGE_ITEM *edge_item नहीं लिखना चाहिए, लेकिन केवल pEDGE_ITEM edge_item

स्पष्ट के लिए, सभी निम्नलिखित घोषणाओं के बराबर हैं:

struct edgeitem *edge_item; 
EDGE_ITEM *edge_item; 
pEDGE_ITEM edge_item; 

लेकिन

pEDGE_ITEM *edge_item; 

struct edgeitem **edge_item; 
EDGE_ITEM **edge_item; 

के बराबर है के बारे में *EDGE next है कि गलत वाक्य रचना। सही वाक्यविन्यास EDGE* next या pEDGE next होगा। तो एक बार struct edge परिभाषित किया गया है कि आप इन दोनों में से किसी एक का उपयोग कर सकते हैं, लेकिन संरचना को परिभाषित करते समय, आपको मेरे उत्तर की शुरुआत में दिखाया जाना चाहिए।

हाँ, निम्नलिखित दो परिभाषा बराबर हैं:

typedef struct edge_list { 
    EDGE  *head; 
} EDGE_LIST; 

typedef struct edge_list { 
    pEDGE  head; 
} EDGE_LIST; 
+0

मैंने देखा कि दोनों उत्तरों में आपने "स्ट्रक्चर एज" का उपयोग करने के लिए लिखा था, यह कैसे सही है कि यह सही नहीं है जबकि पीईजी नहीं है? यह भी अनिर्धारित है? – user1386966

+0

क्योंकि जब तक संरचना पूरी तरह परिभाषित नहीं हो जाती है तब तक आप न तो 'EDGE' और न ही' pEDGE' typedefs का उपयोग नहीं कर सकते हैं। एक बार ऐसा होने के बाद, आप लंबे समय तक 'स्ट्रक्चर एज' या 'स्ट्रक्चर एज *' का उपयोग करने के बजाय टाइपिफ़ का उपयोग कर सकते हैं। – betabandido

+0

आपको बहुत बहुत धन्यवाद !!! – user1386966

2

आप एक प्रकार अन्य नाम का उपयोग कर रहे हैं इससे पहले कि यह परिभाषित किया गया है। संरचना टैग का उपयोग करना एक समाधान नहीं है:

typedef struct edge 
{ 
    EDGE_ITEM *edge_item; 
    struct edge *next;  //pointer to next edge 
    struct edge *prev;  //pointer to prev edge 
} EDGE; 

ध्यान दें कि आप लगभग निश्चित रूप से सूचक उपनाम गलत इस्तेमाल, मैं उन्हें बचा।

0

मुझे लगता है कि यह ठीक काम करना चाहिए।

typedef struct edgeitem 
    { 
     double   weight; 
    }EDGE_ITEM, *pEDGE_ITEM; //also declaration of a pointer 

    /************ edge that includes a pointer to the edge item, next and prev ******/ 
    typedef struct edge *pEDGE; //<<------- this 
    typedef struct edge 
    { 
     pEDGE_ITEM *edge_item; 
     pEDGE  *next;  //pointer to next edge 
     pEDGE  *prev;  //pointer to prev edge 
    }EDGE; 
संबंधित मुद्दे