2016-01-24 12 views
5

मैं यह पता लगाने की कोशिश कर रहा हूं कि सी # में कुछ करने का कोई तरीका है जो सी ++ में करना आसान है। विशेष रूप से, यदि मेरे पास डेटा की एक सरणी है, तो मैं उपखंड को अधिक आसानी से एक्सेस करने के लिए उस डेटा में एक पॉइंटर बना सकता हूं।सरणी के सबसेट तक पहुंचने का तरीका?

उदाहरण के लिए, अगर मेरे पास है:

unsigned char buffer[1000]; 

और मैं निर्धारित है कि सरणी के भीतर पदों 102 से 110 पर एक तार है कि मैं एक बहुत हेरफेर करने के लिए की जरूरत है कि, मैं यह कर सकता:

unsigned char *strPtr = &buffer[102]; 
char firstChar = strPtr[0]; 

यह मुझे बाद के संचालन में प्रत्येक सरणी अनुक्रमणिका में "102" जोड़ने से बचाता है।

जबकि जब आप ऐसा कुछ करते हैं तो असुरक्षित परिस्थितियों की संभावना को पहचानते हैं, तो मुझे आश्चर्य है कि सी # में नैतिक समकक्ष है जो मुझे मौजूदा सरणी के उप-समूह के लिए एक नया संदर्भ बनाने देगा।

कुछ की तरह:

byte [8] newArray = &buffer[102]; 

उदाहरण वास्तव में काम है कि नहीं करता है या मैं इस पोस्टिंग नहीं किया जाएगा, लेकिन मैं इसे मैं क्या भर में पूरा करने के लिए चाहते हैं के विचार हो जाता है लगता है।

+0

क्या आप चाहते हैं कि यह मूल सरणी को कॉपी या संशोधित करे? – BalinKingOfMoria

+0

मैं वास्तव में इसे वापस लिख नहीं रहा हूं, बस इसे पढ़ रहा हूं। मैं डेटा कॉपी करने से बचना चाहता हूं। असल में, मैं नहीं पूछूंगा कि डेटा कॉपी करना एक ट्रिपिंग पॉइंट नहीं था। –

+0

यदि आपकी चिंता केवल डेटा से पढ़ने के लिए है, तो क्यों न केवल 'int offset = 102; बफर [ऑफ़सेट + मैं] ... '? इसका मतलब है कि आपको कार्य पूरा करने के लिए असुरक्षित कोड की आवश्यकता नहीं है। 'ArraySegment 'ऐसा करने के लिए निश्चित रूप से एक क्लीनर दृष्टिकोण भी है। यदि आप किसी कारण से ऑफसेट गणना से बचने की कोशिश कर रहे हैं, तो आपको असुरक्षित कोड का उपयोग करना होगा। –

उत्तर

4

ArraySegment<T> कक्षा है जिसे किसी सरणी के सेगमेंट तक पहुंचने के लिए रैपर के रूप में उपयोग किया जा सकता है। बस सरणी, ऑफ़सेट और सेगमेंट की लंबाई प्रदान करें और आप इसका उपयोग कर सकते हैं जैसे कि यह वास्तविक सरणी थी। आपको सरणी जांचने और सरणी का उपयोग करने के अन्य niceties मिल जाएगा।

var buffer = new byte[1000]; 
var newArray = new ArraySegment<byte>(buffer, 102, 8) as IList<byte> // we have an "array" of byte[8] 
var firstChar = newArray[0]; 

एक proposal तथापि सरणी टुकड़ा करने की क्रिया शुरू करने की है। ऐरे सेगमेंट की तरह, स्लाइस आपको सरणी में दृश्य बनाने की अनुमति देता है (प्रतिलिपि बनाये बिना) और वास्तविक सरणी के स्थान पर उपयोग किया जा सकता है। उम्मीद है कि यह इसे भविष्य के सी # संस्करण में (निकट) बना देगा।

+0

क्या Array सेगमेंट क्या ओपी ऑफसेट के उपयोग के साथ मूल त्रुटि के इच्छित तत्व को प्राप्त/बदलने से बचने का प्रयास कर रहा है? मैंने सोचा कि संरचना आपकी अनुक्रमणिका + आंतरिक '_offset' जोड़कर और परिणामस्वरूप तत्व लौटकर काम करती है। –

+0

@JasonW लेकिन ओपी में वर्णित तकनीक बिल्कुल है, सरणी में "ऑफ़सेट" जोड़ने के लिए एक शॉर्टकट। – Kroltan

+0

ऐसा लगता है कि वह हर बार जब वह तत्व तक पहुंचता है तो ऑफसेट जोड़ने से बचने की कोशिश कर रहा है। मुझे पता है कि _offset संरचना में संग्रहीत है, लेकिन मुझे इस बारे में निश्चित नहीं था कि अगर हर बार तत्व का उपयोग किया जाता है तो _offset का उपयोग किया जाता है (यही मुझे लगता है कि वह किसी भी कारण से रोकने की कोशिश कर रहा है) –

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