2009-03-31 10 views
7

ऐसा कुछ करने का कोई तरीका नहीं है, सी ++ में है?सी ++ संघ सरणी और युद्ध?

union { 
    { 
     Scalar x, y; 
    } 
    Scalar v[2]; 
}; 

कहाँ x == v[0] और y == v[1]?

+2

कृपया ध्यान रखें कि सी ++ गारंटी देता है कि किसी सरणी के तत्वों को संयोग से रखा जाता है, यह केवल गारंटी देता है कि पीओडी संरचना के तत्व का पता सभी पूर्व घोषित तत्वों के पते से अधिक है। इसका मतलब है कि यह संभव है (हालांकि असंभव) कि v [1] और y अनुरूप नहीं है। –

+0

@ j_random_hacker: क्या आप निश्चित हैं? मेरा मानना ​​है कि सी से विरासत में एक और नियम है, जिसमें से योईयू प्राप्त कर सकता है कि प्रारंभिक पैडिंग नहीं है (एलआईआईएस नियमों में कुछ आईआईआरसी, पहले तत्व के प्रकार के सूचक के माध्यम से एक संरचना तक पहुंचने के बारे में) – MSalters

+1

हाँ, वह नियम मौजूद है सी ++ भी। कोई प्रारंभिक पैडिंग नहीं है, लेकिन मुझे लगता है कि @j_random_hackers बिंदु यह है कि पहले तत्व (और दूसरे से पहले) के बाद संरचना में पैडिंग हो सकती है – jalf

उत्तर

14

कैसे के बारे में

union { 
    struct { 
     int x; 
     int y; 
    }; 
    int v[2]; 
}; 

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

union a { 
    struct b { int first, second; } bee; 
    int v[2]; 
}; 

बदसूरत, लेकिन वह

+0

बेशक! एक संरचना! प्रतिभाशाली! – mpen

+1

क्या आप संरचना को एक नाम नहीं देंगे ताकि आप union_name.struct_name.x का संदर्भ दे सकें? –

+0

मैं आपकी "बी मधुमक्खी" रेखा को तोड़ दूंगा जैसे कि आप "struct b {...} मधुमक्खी के साथ समाप्त हो जाते हैं;" – rmeador

1

"स्केलर" क्या है, इसके आधार पर, आप इसे C++ में कर सकते हैं। वाक्यविन्यास लगभग बिल्कुल ठीक है (शायद बिल्कुल बिल्कुल भी, लेकिन मैं यूनियनों पर जंगली हूं) जो आपने अपने उदाहरण में लिखा था। यह सी के समान है, सिवाय इसके कि यूनियनों में होने वाले प्रकारों पर प्रतिबंध हैं (आईआईआरसी के पास उनके पास एक डिफ़ॉल्ट कन्स्ट्रक्टर होना चाहिए)। यहां प्रासंगिक Wikipedia article है।

+0

स्केलर केवल एक फ्लोट या डबल है ... अगर मुझे अधिक सटीकता की आवश्यकता हो तो परिवर्तनीय। धन्यवाद – mpen

16

आप सी ++ और नहीं सी का उपयोग कर रहे हैं, और के बाद से वे एक ही प्रकार के होते हैं और अधिक सटीक है, क्यों नहीं v [0] और y के संदर्भ में v [1]

+2

+1। यह अच्छी तरह से इस तथ्य के आसपास हो जाता है कि वी [1] वाई के अनुरूप होने के लिए सी ++ भाषा नियमों द्वारा गारंटी नहीं है। –

+0

स्थानीय मानों के रूप में इन संदर्भों को घोषित करने के लिए संरचना पर चल रहे कोड के लिए आपका मतलब है: संकलक उन्हें अनुकूलित कर देगा, इसलिए प्रदर्शन के बारे में चिंता करने की आवश्यकता नहीं है। –

6

इसे आजमाएं:

template<class T> 
struct U1 
{ 
    U1(); 
    T v[2]; 
    T& x; 
    T& y; 
}; 

template<class T> 
U1<T>::U1() 
    :x(v[0]) 
    ,y(v[1]) 
{} 

int main() 
{ 
    U1<int> data; 

    data.x = 1; 
    data.y = 2; 
} 
+1

जी ++ आकार देता है (यू 1 ) 12 के बजाय .. 2. जी ++ 4.0.1) –

+0

@ माइकल: आपको ऐसा क्यों लगता है कि यह 2 होना चाहिए? –

+4

मैं कह रहा हूं कि कुछ ऐसा जो अनिवार्य रूप से डेटा के दो टुकड़ों तक पहुंच प्रदान कर रहा है, परिणामी संरचना को दो अतिरिक्त पॉइंटर्स रखकर बड़ी डिग्री से विस्तारित किया जाता है ... यह कुछ मामलों में स्वीकार्य हो सकता है, और दूसरों में अस्वीकार्य हो सकता है .. इस समाधान को देखने वालों को सिर्फ एक चेतावनी। –

4

मैंने पहले ऐसा कुछ उपयोग किया है। मुझे यकीन है कि मानक द्वारा 100% ठीक नहीं है, लेकिन ऐसा लगता है कि इसे किसी भी कंपाइलर के साथ ठीक है, जिसका उपयोग करने के लिए मुझे इसकी आवश्यकता है।

struct Vec2 
{ 
    float x; 
    float y; 
    float& operator[](int i) { return *(&x+i); } 
}; 

आप सीमा ऑपरेटर के लिए [] अगर आप चाहते हैं (आप शायद चाहते हैं चाहिए) की जाँच आदि जोड़ सकते हैं और तुम भी ऑपरेटर [] की एक स्थिरांक संस्करण प्रदान कर सकते हैं।

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