C में संरचना सदस्य के लिए डिफ़ॉल्ट मान


84

क्या कुछ संरचना सदस्य के लिए डिफ़ॉल्ट मान सेट करना संभव है? मैंने निम्नलिखित कोशिश की लेकिन, यह सिंटैक्स त्रुटि का कारण होगा:

त्रुटियाँ:


आप संरचना के लिए एक शुरुआती कार्य बना सकते हैं।
सार्गीज़वी

5
सी। में नहीं। आप एक फ़ंक्शन बना सकते हैं जो उन मूल्यों के साथ एक संरचना देता है जो आप चाहते हैं।
वॉन काटो

जब आप इसे बनाते हैं तो आप इस तरह के मूल्यों को इनिशियलाइज़ कर सकते हैं: stackoverflow.com/questions/749180/default-values-in-ac-struction
शानदार मिस्टर फॉक्स

C ++ संरचना के लिए, आप कंस्ट्रक्टर में डिफ़ॉल्ट डेटा को Zit कर सकते हैं
Zac

जवाबों:


126

संरचना एक डेटा प्रकार है । आप डेटा प्रकार को मान नहीं देते हैं। आप डेटा प्रकारों के उदाहरणों / वस्तुओं को मान देते हैं।
तो नहीं यह सी में संभव नहीं है।

इसके बजाय आप एक फ़ंक्शन लिख सकते हैं जो संरचना उदाहरण के लिए प्रारंभ करता है।

वैकल्पिक रूप से, आप कर सकते हैं:

और फिर हमेशा के रूप में अपने नए उदाहरण शुरू:


3
यदि मेरे पास कोई वैश्विक सरणी है: 'MyStruct arrest [MAX_SIXE]?', फ़ंक्शन का उपयोग कैसे किया जा सकता है? (NOte: मेरे पास एक init () फंक्शन नहीं हो सकता है जो सभी सदस्य के पास जाए और झंडा सेट करे)
user1508893

10
MyStruct_default को const के रूप में घोषित किया जाना चाहिए।
लंडिन

1
आपके उत्तर के लिए धन्यवाद। इसे ऑनलाइन टेस्ट करने के लिए एक कोड सैंडबॉक्स बनाने का प्रयास किया, पहली बार में सब कुछ कनेक्ट करने में परेशानी हुई, आशा है कि यह किसी और की मदद करता है: ideone.com/knQ7xS
होल्डऑफ ह्यूंगर

52

आप इसे इस तरह से नहीं कर सकते

इसके बजाय निम्नलिखित का उपयोग करें

आप अपने उदाहरणों को परिभाषित करने और आरंभ करने के लिए मैक्रो का उपयोग कर सकते हैं । इससे आप हर बार नए उदाहरण को परिभाषित करना चाहते हैं और इसे आरंभ कर सकते हैं।

और अपने कोड में जब आपको कर्मचारी प्रकार के साथ नए उदाहरण को परिभाषित करने की आवश्यकता होती है, तो आप इस मैक्रो को कॉल करते हैं जैसे:


1
आवश्यकताओं को पूरा नहीं करने के लिए पास करना चाहते हैं तो अच्छा नहीं लगता।

18

मैं एल्स से सहमत हूं कि आप सी में संरचना को परिभाषित करने के समय पर प्रारंभ नहीं कर सकते हैं। लेकिन आप नीचे दिखाए गए उदाहरणों को बनाने के समय संरचना को आरंभीकृत कर सकते हैं।

सी में,

C ++ में नीचे दी गई संरचना की परिभाषा में प्रत्यक्ष मूल्य देना संभव है


13

तुम कर सकते हो:

और फिर आपको बस एक नया कर्मचारी चर घोषित करते समय डिफ़ॉल्ट आरंभीकरण करना याद रखना होगा:

वैकल्पिक रूप से, आप हमेशा फ़ैक्टरी फ़ंक्शन के माध्यम से अपने कर्मचारी संरचना का निर्माण कर सकते हैं।


8

यदि आप उपयोग कर रहे हैं तो आप ऑब्जेक्ट निर्माण में gccदे सकते हैं designated initializers

या, बस सरणी आरंभीकरण की तरह उपयोग करें।

employee e = {0 , "none"};


1
मैंने देखा है कि कुछ कोड निर्दिष्ट इनिशियलाइज़र के लिए भी कॉलन का उपयोग करते हैं, इस प्रश्न में अधिक: stackoverflow.com/questions/1601201/…
sdaau

7

एक डिफ़ॉल्ट संरचना बनाएं जैसा कि अन्य उत्तरों में उल्लेख किया गया है:

हालाँकि, उपरोक्त कोड हेडर फ़ाइल में काम नहीं करेगा - आपको त्रुटि मिलेगी multiple definition of 'MyStruct_default':। इस समस्या को हल करने के लिए, externहेडर फ़ाइल में इसके बजाय का उपयोग करें :

और cफाइल में:

आशा है कि यह हेडर फ़ाइल में किसी को भी परेशानी होने में मदद करता है।


कुछ साल बाद एक टिप्पणी: यह शायद अधिक समझ में आता है अगर आप इसे हेडर फ़ाइल में सीधे कर सकते हैं।
डेविड कॉलनान

5

इससे भी अधिक, मौजूदा उत्तरों को जोड़ने के लिए, आप एक मैक्रो का उपयोग कर सकते हैं जो एक संरचना आरम्भक को छुपाता है:

फिर अपने कोड में:


3

आप एक आरंभिक कार्य को कार्यान्वित कर सकते हैं:


यह ध्यान दिया जाता है कि C संरचना चर वस्तु e (const या not) उस ब्लॉक से दूर चली जाएगी जब वह जिस ब्लॉक से बाहर निकलता है। यदि यह एक पॉइंटर है, तो यह डैंगलिंग पॉइंटर मुद्दे का कारण होगा। तो, यह एक अच्छा समाधान नहीं है यदि रिटर्न प्रकार एक सूचक है। सबसे अच्छा तरीका यह है कि सी स्टैम्पलाइज़र्स का उपयोग करके डिफ़ॉल्ट मानों के साथ एक स्थिर ग्लोबल स्ट्रक्चर वेरिएबल ऑब्जेक्ट है और प्रोग्राम रनटाइम के दौरान अपने मानों को बदलने के लिए वेरिएबल के लिए सेट और फ़ंक्शंस प्राप्त करें। या सेट के फंक्शन के लिए एक स्थानीय स्ट्रक्चर वेरिएबल ऑब्जेक्ट को एक पैरामीटर के रूप में पास करें और सेट फंक्शन के अंदर उसके प्रॉपर्टी वैल्यू को बदलें।
चाचा जुएल

2
क्षमा करें, लेकिन यह सिर्फ गलत है @ecle। वापसी मूल्य एक नग्न संरचना है, न कि एक सूचक। इसे कॉपी किया जाएगा, संदर्भ से नहीं लौटाया जाएगा। ईमानदारी से, संकलक संभवत: इसके बाहर बिल्ली का अनुकूलन करेगा।
बिटमस्क

@bismask मुझे गलत नहीं लगता..मैंने उल्लेख किया कि क्या फ़ंक्शन पॉइंटर लौटाता है यदि यह एक पॉइंटर है । हो सकता है कि आपने मेरे हालिया संपादन से पहले मेरी पिछली टिप्पणी पर टिप्पणी की हो।
चाचा

2

आप संरचना को आरंभ करने के लिए कुछ फ़ंक्शन का उपयोग कर सकते हैं,

संपादित करें:


2
ठीक है, क्या होगा अगर मैं एक वैश्विक सरणी रखना चाहता हूं, तो आप GetMyStruct () को कैसे प्रस्तावित करेंगे?
user1508893

GetMyStruct मॉलॉक का उपयोग नहीं करना चाहिए?
दिमित्री

2

आप var सुविधा के साथ C प्रीप्रोसेसर कार्यों के संयोजन का उपयोग कर सकते हैं , यौगिक शाब्दिक और अधिकतम सुविधा के लिए निर्दिष्ट इनिशियलाइज़र :


1

यदि आप केवल एक बार के लिए इस संरचना का उपयोग करते हैं , अर्थात एक वैश्विक / स्थिर वैरिएबल बनाते हैं, तो आप typedefइस वैरिएबल को तुरंत हटा सकते हैं और आरंभिक कर सकते हैं:

फिर, आप उसके employeeबाद अपने कोड में उपयोग कर सकते हैं ।


0

एक संरचना के लिए एक आरंभीकरण फ़ंक्शन डिफ़ॉल्ट मान प्रदान करने का एक अच्छा तरीका है:

या इससे भी कम:


यदि मेरे पास कोई वैश्विक सरणी है: 'MyStruct arrest [MAX_SIXE]?', फ़ंक्शन का उपयोग कैसे किया जा सकता है? (NOte: मेरे पास एक इनिट () फंक्शन नहीं हो सकता है जो सभी सदस्य के पास जाए और झंडा सेट करे)
user1508893

0

डिफ़ॉल्ट मानों के लिए एक और तरीका। संरचना के समान प्रकार के साथ एक प्रारंभिक कार्य करें। अलग-अलग फ़ाइलों में बड़े कोड को विभाजित करते समय यह दृष्टिकोण बहुत उपयोगी है।


0

आप इसके लिए एक फ़ंक्शन बना सकते हैं:


0

एक अन्य दृष्टिकोण, यदि संरचना इसकी अनुमति देती है, तो # डिफ़ॉल्ट मान के साथ #define का उपयोग करना है:

उपयोग:


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.