2016-08-17 9 views
8

मैं सीकॉन्स्ट आत्म निर्देशात्मक संरचनाओं

में लिख रहा हूँ मैं एक नए प्रकार (noFunc_menuEntry) जो एक आत्म निर्देशात्मक संरचना से बना है परिभाषित किया है।

struct noFunc_menuEntry_tag { 
    const char *text; 
    struct noFunc_menuEntry_tag *up_entry; 
    struct noFunc_menuEntry_tag *down_entry; 
    struct noFunc_menuEntry_tag *back_entry; 
    struct noFunc_menuEntry_tag *enter_entry; 
}; 
typedef struct noFunc_menuEntry_tag noFunc_menuEntry; 

मैं इस तरह चर की एक श्रृंखला परिभाषित करने की जरूरत:

menuEntry_1 = {title_1, &menuEntry_2, &menuEntry_4, &menuEntry_1, &menuEntry_5}; 
menuEntry_2 = {title_2, &menuEntry_3, &menuEntry_1, &menuEntry_1, &menuEntry_6}; 

और इतने पर।

इसलिए मुझे चर की घोषणा और परिभाषा को अलग करने की आवश्यकता है, क्योंकि प्रत्येक चर अन्य चर पर निर्भर करता है। के लिए

void menu_init(void) 
{ 
     menuEntry_1.text = title; 
     menuEntry_1.up_entry = &menuEntry_2 
} 

और इतने पर: एक हेडर फाइल में मैं घोषणा

noFunc_menuEntry menuEntry_1, menuEntry_2, menuEntry_3, menuEntry_4, menuEntry_5, menuEntry_6; 

चर आदि ..., और एक समारोह में एक ग फ़ाइल में मैं प्रारंभ किया है लिखा है अन्य सदस्यों और चर।

हालांकि मैं अपने चर const होना चाहते हैं:

const noFunc_menuEntry menuEntry_1, menuEntry_2, menuEntry_3, menuEntry_4, menuEntry_5, menuEntry_6; 

तो मेरे सवाल घोषणा और प्रकार मैं परिभाषित किया है की const चर की परिभाषा separing बारे में है। मैं कैसे कर सकता हूँ? क्या मुझसे कुछ गलत हो रही है?

स्वाभाविक रूप से अगर मैं घोषणा में const जोड़ता हूं, तो संकलक मुझे एक त्रुटि रिपोर्ट करता है जब मैं चर शुरू करता हूं (मैं केवल-पढ़ने योग्य चर लिखने की कोशिश कर रहा हूं)।

+0

में यह परिभाषित करने के साथ आगे बढ़ना आप पहले से ही 'menuEntry_1 = साथ चर init, तो {TITLE_1, और menuEntry_2, और menuEntry_4, और menuEntry_1, और menuEntry_5};', क्यों आप उन्हें फिर से 'menu_init' में प्रारंभ होगा? – user694733

+0

चूंकि आपकी संरचना में इन (ग्लोबल) चर के लिए * पॉइंटर्स * शामिल हैं, मेरा मानना ​​है कि आप उन्हें केवल परिभाषित करने और एक पंक्ति में आरंभ करने में सक्षम होना चाहिए, यानी प्रारंभिकरण के लिए कार्य करने की आवश्यकता नहीं है।यह सच है कि * "प्रत्येक चर अन्य चरों पर निर्भर करता है" *, लेकिन यदि आप 'menuEntry_1' सामग्री बदल रहे हैं, तो इसका मतलब यह नहीं है कि '& menuEntry_1' बदल जाएगा। – Groo

+0

@ user694733: यदि मैं उन्हें 'const' के रूप में उपयोग नहीं करता हूं, तो मैं 'menu_init' में चर प्रारंभ करता हूं, लेकिन यदि उन्हें स्वाभाविक रूप से' const 'होना है, तो मैं' menu_init' का उपयोग नहीं करता हूं। मैं इसे करने का सही तरीका ढूंढ रहा था! – BzFr

उत्तर

6

यदि आप इन चरों को const होना चाहते हैं, तो आपको फ़ंक्शन के बिना प्रारंभ करना होगा।

लेकिन पहले, के प्रकार परिभाषा में const संभालने दें:

typedef struct noFunc_menuEntry_tag noFunc_menuEntry; 
struct noFunc_menuEntry_tag { 
    const char *text; 
    const noFunc_menuEntry *up_entry; 
    const noFunc_menuEntry *down_entry; 
    const noFunc_menuEntry *back_entry; 
    const noFunc_menuEntry *enter_entry; 
}; 

फिर हेडर फाइल के लिए घोषणाओं:

extern const noFunc_menuEntry menuEntry_1; 
extern const noFunc_menuEntry menuEntry_2; 
... 

और अंत में परिभाषा और आरंभीकरण स्रोत फ़ाइल में:

const noFunc_menuEntry menuEntry_1 = {title_1, &menuEntry_2, &menuEntry_4, &menuEntry_1, &menuEntry_5}; 
const noFunc_menuEntry menuEntry_2 = {title_2, &menuEntry_3, &menuEntry_1, &menuEntry_1, &menuEntry_6}; 
... 
6

आप use an array कर सकते हैं, क्योंकि item_i का तात्पर्य है कि आपको इसकी आवश्यकता हो सकती है।

typedef struct noFunc_menuEntry_tag { 
    const char *text; 
    const struct noFunc_menuEntry_tag *up_entry; 
    const struct noFunc_menuEntry_tag *down_entry; 
    const struct noFunc_menuEntry_tag *back_entry; 
    const struct noFunc_menuEntry_tag *enter_entry; 
} noFunc_menuEntry; 


int main(void) { 
    const noFunc_menuEntry menuEntry[4] = { 
     {"", &menuEntry[0], &menuEntry[1], &menuEntry[2], &menuEntry[3]}, 
     {"", &menuEntry[0], &menuEntry[1], &menuEntry[2], &menuEntry[3]}, 
     {"", &menuEntry[0], &menuEntry[1], &menuEntry[2], &menuEntry[3]}, 
     {"", &menuEntry[0], &menuEntry[1], &menuEntry[2], &menuEntry[3]}, 
    }; 
    return 0; 
} 
+1

मुझे लगता है कि यह काम करने का यह एक साफ तरीका है। – haccks

1

हेडर में घोषणा में extern const का उपयोग करें। extern केवल किसी भी मेमोरी को आवंटित किए बिना प्रोग्राम में उपयोग के लिए चर घोषित करेगा। तब मुख्य const noFunc_menuEntry menuEntry_1 = {title_1, &menuEntry_2, &menuEntry_4, &menuEntry_1, &menuEntry_5}; .. so on

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