2011-03-29 17 views
7

सी ++/सीएलआई में पिन करना, क्या कोई सरणी पिन करना संभव है जिसमें कोई तत्व नहीं है?एक खाली सरणी

उदा।

array<System::Byte>^ bytes = gcnew array<System::Byte>(0); 
pin_ptr<System::Byte> pin = &bytes[0]; //<-- IndexOutOfRangeException occurs here 

एमएसडीएन द्वारा दी गई सलाह में खाली सरणी के मामले को शामिल नहीं किया गया है। http://msdn.microsoft.com/en-us/library/18132394%28v=VS.100%29.aspx

एक तरफ, आप सोच सकते हैं कि मैं एक खाली सरणी क्यों पिन करना चाहता हूं। संक्षिप्त जवाब यह है कि मैं कोड सादगी के लिए खाली और गैर-खाली सरणी का इलाज करना चाहता हूं।

उत्तर

6

नहीं, pin_ptr <> के साथ नहीं। आप एक ही प्राप्त करने के लिए GCHandle पर वापस आने सकता है:

using namespace System::Runtime::InteropServices; 
... 
    array<Byte>^ arr = gcnew array<Byte>(0); 
    GCHandle hdl = GCHandle::Alloc(arr, GCHandleType::Pinned); 
    try { 
     unsigned char* ptr = (unsigned char*)(void*)hdl.AddrOfPinnedObject(); 
     // etc.. 
    } 
    finally { 
     hdl.Free(); 
    } 

आप के बजाय btw List<Byte>^ का उपयोग करना चाहिए मेरे लिए लग रहा है।

+0

काम कर जवाब के लिए धन्यवाद है! 'सूची ^'का उपयोग करने के बारे में आपकी टिप्पणी के बारे में, क्या गतिशील रूप से आकार बदलने योग्य होने के अलावा कुछ लाभ है? विशेष परिदृश्य में मेरे लिए आकार बदलना कोई मुद्दा नहीं है। – dss539

+0

बस आपने सुना जैसे आप सरणी का आकार बदल रहे थे। नज़रअंदाज़ करना। –

+0

दूसरे विचार पर, आप सिर्फ एक शून्य सूचक क्यों नहीं देते? आपको जिस पॉइंटर को वैसे भी मिलता है उसे कभी भी अव्यवस्थित नहीं करना चाहिए। कम से कम एक शून्य सूचक के साथ आप देखेंगे। –

1

आप 0 शून्य तत्वों के साथ एक क्लाई ऑब्जेक्ट array पिन नहीं कर सकते क्योंकि सरणी में कोई स्मृति समर्थन नहीं है। आप स्पष्ट रूप से कुछ पिन नहीं कर सकते हैं जिसमें इंगित करने के लिए कोई स्मृति नहीं है।

CLI वस्तु array मेटाडाटा अभी भी मौजूद है, हालांकि, और यह कहा गया है कि सरणी लंबाई 0.

+1

उत्तर के लिए धन्यवाद। हालांकि, हंस ने साबित कर दिया है कि आप एक खाली सरणी पिन कर सकते हैं। मेरे लिए क्या स्पष्ट है हमेशा सही नहीं है। ऐसा लगता है कि मैं अकेला नहीं हूं। : डी – dss539

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