2011-03-29 17 views
7

C++/CLI'de, eleman içermeyen bir diziyi sabitlemek mümkün mü?Boş bir diziyi sabitleme

örn.

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

MSDN tarafından verilen öneri boş dizileri kapsamaz. http://msdn.microsoft.com/en-us/library/18132394%28v=VS.100%29.aspx

Bir kenara göre neden boş bir diziyi sabitlemek isteyebileceğimi merak edebilirsiniz. Kısa cevap, boş ve boş olmayan dizileri kod sadeliği için de aynı şekilde kullanmak istiyorum.

cevap

6

Hayır, pin_ptr ile değil <>. Aynı elde etmek GCHandle çare olabilir:

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(); 
    } 

yerine btw List<Byte>^ kullanarak olmalıdır geldi bana.

+0

Teşekkür olduğunu belirtmektedir! 'List ^' ile ilgili yorumunuzla ilgili olarak, dinamik olarak yeniden boyutlandırılabilmenin dışında bir fayda var mı? Yeniden boyutlandırma, belirli senaryoda benim için bir sorun değil. – dss539

+0

Sadece dizileri yeniden boyutlandırıyor gibiydiniz. Aldırmamak. –

+0

İkinci olarak, neden boş bir işaretçiyi geçmiyorsunuz? Yine de aldığın işaretçiyi asla ayırmamalısın. En azından boş bir işaretçi ile farkedeceksiniz. –

1

0 sıfır öğesi ile bir array nesnesini bir nesneye sabitleyemezsiniz, çünkü dizinin bellek desteği yoktur. Belli ki, işaret edecek bir belleği olmayan bir şeyi sabitleyemezsiniz.

cli nesne array meta hala ancak vardır ve burada dizi uzunluk çalışma cevap 0.

+1

Cevabınız için teşekkürler. Bununla birlikte, Hans boş bir diziyi sabitleyebileceğinizi kanıtlamıştır. Benim için bariz olan şey her zaman doğru değildir. Görünüşe göre tek ben değilim. : D – dss539