2010-07-03 4 views
5

मेरे पास एक संरचना है:सभी संरचना सदस्यों को एक ही मूल्य पर कैसे सेट करें?

struct something { 
    int a, b, c, d; 
}; 

क्या उन सभी को ए, बी, सी, डी को कुछ मूल्यों में अलग-अलग टाइप करने की आवश्यकता के बिना सेट करने का कोई आसान तरीका है:

something var = {-1,-1,-1,-1}; 

अभी भी बहुत अधिक है पुनरावृत्ति (आइए कल्पना करें कि संरचना में 30 सदस्य हैं ...)

मैंने "संरचनाएं" या कुछ के बारे में सुना है, लेकिन मैं कोड के विभिन्न हिस्सों में उन मानों को किसी अन्य चीज़ में सेट करना चाहता हूं।

+0

क्या आपको पीओडी रहने के लिए संरचना की आवश्यकता है, उदाहरण के लिए अभी भी कुल प्रारंभिकता ('foo = {bar};') है? –

+0

हाँ इसे सामान्य संरचना की तरह कार्य करना चाहिए, सिवाय इसके कि मैं बस सभी सदस्यों को कुछ अच्छी तरह से सेट करना चाहता हूं। – Newbie

+0

उन्हें टाइप करने में क्या गलत है? शायद लोगों को अपनी गति में सुधार करने के लिए कीबोर्डिंग (टाइपिंग) कक्षा लेने की आवश्यकता है। –

उत्तर

13

यह है मेरी इस सवाल के लिए दूसरा जवाब। जैसा आपने पहले पूछा था, लेकिन जैसा कि अन्य टिप्पणीकारों ने बताया, यह चीजों को करने का उचित तरीका नहीं है और यदि आप सावधान नहीं हैं तो आपको लाइन में परेशानी हो सकती है। इसके बजाय, इस प्रकार अपनी struct के लिए कुछ उपयोगी कंस्ट्रक्टर्स लिखने के लिए है:

struct something { 
    int a, b, c, d; 

    // This constructor does no initialization. 
    something() { } 

    // This constructor initializes the four variables individually. 
    something(int a, int b, int c, int d) 
     : a(a), b(b), c(c), d(d) { } 

    // This constructor initializes all four variables to the same value 
    something(int i) : a(i), b(i), c(i), d(i) { } 

// // More concise, but more haphazard way of setting all fields to i. 
// something(int i) { 
//  // This assumes that a-d are all of the same type and all in order 
//  std::fill(&a, &d+1, i); 
// } 

}; 

// uninitialized struct 
something var1; 

// individually set the values 
something var2(1, 2, 3, 4); 

// set all values to -1 
something var3(-1); 
6

आप संरचना के लिए एक विधि परिभाषित कर सकते हैं। तो क्यों नहीं:

struct something { 
    int a, b, c, d; 

    void set_values(int val) 
    { 
     a = b = c = d = val; 
    } 
}; 

something foo; 

foo.set_values(-1); 

इसका निश्चित रूप से बिंदु का उल्लेख @sbi टिप्पणी में उठाया लायक: यदि आप आशय रहे struct प्रारंभ करने में है, तो आप तो एक निर्माता के साथ क्या करना चाहिए। आपको अपने structs/ऑब्जेक्ट के उपयोगकर्ताओं को इसे अनुपयोगी/त्रुटि स्थिति में रखने की अनुमति देना चाहिए।

+0

वह उन्हें अलग से टाइप नहीं कर रहा है? 'Init' होने के बाद एक तर्क –

+0

काम करेगा, क्षमा करें, मैंने इसे संपादित किया, जब मैंने अपना प्रश्न दोहराया। – Alan

+1

मुझे लगता है कि, इस मामले में, यह अधिक स्पष्ट रूप से व्यक्त किया जाएगा: ए = बी = सी = डी = वैल; – Ferruccio

8

सीधे शब्दों में struct एक निर्माता दे:

struct something { 
    int a, b, c, d; 
    something() { 
     a = b = c = d = -1; 
    } 
}; 

और फिर इसे का उपयोग करें:

int main() { 
    something s; // all members will be set to -1 
} 

आप भी सदस्यों को रीसेट करने के निर्माता का उपयोग कर सकते हैं:

int main() { 
    something s; // all members will be set to -1 
    s.a = 42; 
    s = something(); // reset everything back to -1 
} 
+0

एक ही चीज़ याद नहीं करेगा? मुझे लगता है कि यह अपनी ओओनेस को खो देगा और अगर आप इसके बजाय मेमसेट करते हैं तो अधिक सी-जैसे रहें। –

+0

मेमसेट चार्ट पर काम करता है, न कि चार से अलग आकार की वस्तुओं पर। हालांकि यह 0 और -1 के लिए काम करता है (कम से कम x86 पर, मैं अलग-अलग प्लेटफॉर्म पर इस पर शर्त नहीं लगाऊंगा), अगर प्रारंभिक मान बदल जाता है तो इसके परिणामस्वरूप गलत असाइनमेंट होंगे। उदाहरण के लिए, 'int i; मेमसेट (& i, 1, sizeof (i)); 'आकार में (int) 1 को स्टोर करेगा, जो 32 बिट मशीन पर 0x01010101 है। – Rudi

+0

@ रुडी: हाँ, आप सही हैं। मैं ओपी का उदाहरण शाब्दिक अर्थ में ले रहा था जिसका अर्थ है कि वह सभी मानों को -1 पर सेट करना चाहता है। –

1

के रूप में मैं इकट्ठा, आप अपने struct रहने के लिए एक POD लेकिन अभी भी कुछ "सुविधा निर्माता" करना चाहते हैं चाहते हैं।
इसे करने के लिए एक निर्माता इस मामले में काम जोड़ना होगा नहीं के रूप में आप पॉड सत्ता खो देंगे, इस प्रकार मैं एक सहायक समारोह का उपयोग करेंगे:

something make_something() { 
    something s = { -1, -1, -1, -1}; 
    return s; 
} 

आप अलग-अलग मान के लिए सेट करना चाहते हैं,

something make_something(int i = 0) { 
    something s = { i, i, i, i }; 
    return s; 
} 

अब आप परिभाषा और एक लाइन के लिए नीचे प्रारंभ प्राप्त कर सकते हैं: समारोह एक, हो सकता है वैकल्पिक, पैरामीटर ले जाने

something s = make_something(-1); 
+0

क्या यह फ़ंक्शन किसी भी तरह से एलन के उत्तर से भिन्न होता है जहां फ़ंक्शन संरचना के अंदर होता है? मुझे बाहरी फ़ंक्शन बनाने का कोई बिंदु नहीं दिखाई देता है, जब यह अभी भी (संभवतः) एक संरचना के साथ काम करता है। – Newbie

+0

@ न्यूबी: केवल उल्लेखनीय अंतर यह है कि आपको अपने समाधान के साथ और बयान की आवश्यकता है: 'कुछ एस; s.set_values ​​(-1); 'बनाम' कुछ एस = make_something (-1); '। जब सीधे तर्क के रूप में गुजरता है तो यह अधिक स्पष्ट हो जाता है: 'कुछ; s.set_values ​​(-1); some_func (')। 'बनाम' some_func (make_something (-1));'। –

+0

यदि आप सी ++ का उपयोग कर रहे हैं, तो आपकी संरचना एक कक्षा है। तो 'वर्ग की तरह' बिट्स (कन्स्ट्रक्टर) जोड़ना इसके पॉडनेस को बदल नहीं रहा है।गन्सलिंगर की विधि तब भी काम करेगी जब आप इसे शुरू करना भूल जाते हैं, कुछ माईवर घोषित करके; उदाहरण के लिए: यह एक बड़ा फायदा है। –

1

आप का एक संघ बनाने आर संरचना, और एक सरणी। और सरणी को प्रारंभ करने के लिए एक लूप का उपयोग करें।(पता

int* pfoo; 
for (int i = 0; i < sizeof(foo); i++) 
{ 
    pfoo = (int*)((int)(&foo) + i*sizeof(int)); 
    *pfoo = f(i/2); //set the values (here: the values of a random function f) 
} 

यह लिखते स्मृति सीधे & foo पर शुरू:

union something { 
    struct { 
     int a,b,c,d; 
    }; 
    int init[4]; 
}; 

    something truc; 
    for (int i=0; i<4; i++) truc.init[i] = -1; 
+0

हम्म ... यह अच्छा लगता है, अगर मैं सिर्फ लूप को प्रत्येक स्ट्रक्चर के साथ काम कर सकता हूं जिसमें सदस्य हैं? किसी भी तरह लूप के लिए init सदस्य का आकार मिलता है? क्या यह संभव है? – Newbie

+0

मुझे चेतावनी मिलती है "गैर मानक विस्तार का उपयोग: नामहीन संरचना/संघ" #pragma का उपयोग कर त्रुटि को अक्षम किए बिना मैं इस त्रुटि से कैसे बच सकता हूं? और कार्यक्षमता वही रहें? – Newbie

+1

यह वास्तव में बहुत ही सुरुचिपूर्ण –

1

आप है

struct 
{int a,b,c.......;}foo; 

मुझे लगता है कि कोड लिखा है और यह ठीक काम कर रहा है संरचना में पहले चर के)

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