c स्थिर आत्म-संदर्भित संरचनाएं




struct const (3)

मैं सी में लिख रहा हूँ

मैंने एक नया प्रकार (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};

और इसी तरह।

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

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

आदि ..., और किसी फ़ंक्शन में .c फ़ाइल में मैंने चर को आरंभ किया है:

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

और अन्य सदस्यों और चर के लिए

हालांकि मैं चाहता हूं कि मेरे चर को const :

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

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

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

https://code.i-harness.com


आप एक सरणी का उपयोग कर सकते हैं , चूंकि 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;
}

यदि आप इन चर को 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};
 ...

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





self-reference