2010-09-02 9 views
9

मैं निम्नलिखित कोड में आया, और कहा गया था कि इसका मतलब है कि COL_8888_RED "एंडियन स्वतंत्र" है। क्यूं कर? इस एंडियन स्वतंत्र क्या बनाता है? (मैं मूल सांकेतिक शब्दों में बदलनेवाला कहा है, लेकिन वे मेरे पास वापस नहीं मिल रहे हैं ... बिल्ली शायद वे नहीं जानते या तो।)इस कोड को "एंडियन स्वतंत्र" क्या बनाता है?

union _colours { 
    uint8 c[3][4]; 
    uint32 alignment; 
}; 

static const union _colours col_8888 = { 
     { /* B  G  R  A in memory  */ 
       { 0x00, 0x00, 0xFF, 0xFF, }, /* red */ 
       { 0x00, 0xFF, 0x00, 0xFF, }, /* green */ 
       { 0xFF, 0x00, 0x00, 0xFF, }, /* blue */ 
     } 
}; 

#define COL_8888_RED *((uint32 *)&col_8888.c[0]) 
+0

एंडियन स्वतंत्र क्या हो सकता है सुरक्षित नहीं है, क्योंकि कुछ अलग हार्डवेयर एआरजीबी, बीजीआरए, आरजीबीए, इतने आगे और आगे चुन सकते हैं ... –

+0

@ डैश-टॉम-बैंग, वास्तव में अन्य प्रकार के डिस्प्ले को लाल, विभिन्न बाइट ऑर्डर में परिभाषित करने के लिए हरा और नीला। और इस उदाहरण में 'col_8888' यूनियन एक विशिष्ट प्रकार के डिस्प्ले के लिए लाल, हरा और नीला परिभाषित करता है, और इस प्रकार एक विशिष्ट बाइट ऑर्डर को परिभाषित करता है - इसका उपयोग * केवल * उस प्रकार के डिस्प्ले को लिखने के लिए किया जाता है। अन्य डिस्प्ले प्रकारों को लाल, हरे और नीले रंग की विभिन्न परिभाषाओं की आवश्यकता होगी। – BeeBand

उत्तर

11

यह कोड में "endian स्वतंत्र" नहीं है समझें कि विभिन्न अंतहीनता वाले प्लेटफॉर्म आपको COL_8888_RED के माध्यम से देखे गए विभिन्न मान देंगे। दूसरे शब्दों में, एंडियन-निर्भरता की पारंपरिक समझ में यह कोड एंडियन-निर्भर के रूप में होता है जैसा कि यह कभी मिलता है।

एक अलग सवाल यह है कि COL_8888_RED का उपयोग किया जाना चाहिए। हो सकता है कि यह कुछ एपीआई को पारित करने का इरादा है, जो स्वयं ही इस बिंदु पर एंडियन-निर्भर है कि एपीआई की एंडियन-निर्भरता COL_8888_RED की एंडियन-निर्भरता को रद्द कर देती है। उस स्थिति में सब कुछ "इरादे के रूप में" काम करेगा, यानी एंडियन-स्वतंत्र रूप से। (उदाहरण के लिए, यदि एपीआई uint32 के रूप में रंग मूल्य प्राप्त करता है और उसके बाद ARGB घटकों में एक ही संघ का उपयोग करके इसे अलग करती है, यह सही मूल ARGB मूल्यों endianness की परवाह किए बिना मिल जाएगा।)

लेकिन फिर भी, कि कहने के लिए COL_8888_RED का मूल्य स्वयं ही अंत-स्वतंत्र है पूरी तरह से गलत है।

+1

@ एंड्रे, क्या बेहतर शब्द "एंडियन अज्ञेयवादी" होगा? – BeeBand

+0

@BeeBand, फिर हम सवाल देखते हैं "यह कोड एंडियन अज्ञेयवादी क्यों है"। इसे समझने की एक ही डिग्री किसी अन्य शब्द में उपयोग की जाएगी। – maxwellb

+0

@Andrey, 'COL_8888_RED' को' uint32' की सरणी में सीधे एक तत्व पर लिखा जा रहा है। – BeeBand

2

मुझे लगता है कि एक मैक्रो के रूप में COL_8888_RED हमेशा एक यूंट 32 होगा, जो तब तक मैक्रो COL_8888_RED हमेशा उपयोग किया जाता है, स्रोत बाइट सरणी {0x00,0x00,0xFF, 0xFF} हमेशा अनुवाद करेगा कि क्या प्रोग्रामर लाल के रूप में मतलब करना चाहता है।

परिभाषा का अर्थ है कि आप एक ही एंड्रॉइड, या छोटे एंडियन, मशीन पर एक ही स्रोत कोड लिख सकते हैं, और एक अलग सरणी से लॉजिकल रंग में जा सकते हैं।

संपादित करें: फिर, एक गणना का उपयोग न करें, या स्थिर "1" की तरह क्यों न करें?

शायद, मूल API निर्माता, स्मृति में {0x00,0x00,0xFF, 0xFF} के किसी अन्य स्थान पर बात करने के लिए सक्षम होने के लिए करना चाहता था ताकि कोड की तरह निम्नलिखित लिखा जा सकता है:

uint8 *p = malloc(sizeof(uint8)*4); 

fread(p, sizeof(uint8), 4, inBuff); 

if(*((uint32 *)p) == COL_8888_RED) 
{ 
    printf("I read red!\n"); 
} 
+0

एफडब्ल्यूआईडब्ल्यू, इस तरह कास्टिंग सख्त-एलियासिंग नियमों का असर पड़ता है, जो वास्तव में समस्याओं का कारण बन सकता है, खासकर अनुकूलन के साथ। –

3

सारणी बाइट्स लगभग सभी आर्किटेक्चर पर स्वतंत्रता स्वतंत्र हैं। इसे बाइट सरणी के रूप में असाइन करके, प्रोग्रामर डेटा के लिए लगातार सामग्री सुनिश्चित करता है। किसी भी वास्तुकला पर बाइट्स को अलग-अलग एक्सेस किया जा सकता है। अगर कोडर ने सिर्फ 3 शब्दों की सरणी बनाई है, तो मशीन अंतहीनता बिट्स के सटीक लेआउट को निर्धारित करने में एक भूमिका निभाएगी।

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