2011-08-22 26 views
8

başardı koddan boyutlu dizi:Geçiş çoklu - Ben aşağıdakileri yapmak istiyorum yönetilmeyen kod

  1. böyle C# kodu üç dimesinal dizi oluşturun:

    var myArray = new short[x,y,z]; 
    UnanagedFunction(myArray); 
    
  2. iletin böyle yönetilmeyen kodu (C++):

    void UnmanagedFunction(short*** myArray) 
    { 
        short first = myArray[0][0][0]; 
    } 
    

Aşağıdaki kodu çalıştığımda çalışma zamanı hatası var GÜNCELLEME:

Attempted to read or write to protected memory.

teşekkür ederiz !!!

+0

C++ 'da böyle bir kod yazamazsınız. –

+0

kodun ilk kısmı C# içinde ikincisi C++ 'dır ve şimdi onu denedim derleyici bana C++ kodu verir –

+1

Belki kodunuzu bir dizi üçlüye dönüştürebilirsiniz. – Simon

cevap

7
IntPtr Array3DToIntPtr(short[, ,] Val) 
     { 
      IntPtr ret = Marshal.AllocHGlobal((Val.GetLength(0) + Val.GetLength(1) + Val.GetLength(2)) * sizeof(short)); 

      int offset = 0; 
      for (int i = 0; i < Val.GetLength(0); i++) 
      { 

       for (int j = 0; j < Val.GetLength(1); j++) 
       { 
        for (int k = 0; k < Val.GetLength(2); k++) 
        { 
         Marshal.WriteInt16(ret,offset, Val[i, j, k]); 
         offset += sizeof(short); 


        } 
       } 
      } 

      return ret; 
     } 

Bu test edilmiş ve çalışır, tek sınırlama olması kullanıyorum bu :-) yazmak için ok ok emin eminim unutmayın Eğer bitmiş işaretçi üzerinde Marshal.FreeHGlobal aramak için ya da bir bellek sızıntısı alırsınız, ben de C++ işlevini değiştirmenizi öneririm böylece dizi boyutlarını kabul eder veya sadece belirli bir dizi 3d dizileri kullanabileceksiniz boyut

+0

Çok teşekkür ederim! !! –

2

Saf C# ile yazıyorum, ancak Func'dan unsafe static'u çıkarırsanız, Func C/C++ içinde çalışmalıdır. Ben notunu ben bu Indexing into arrays of arbitrary rank in C#

static unsafe void Main(string[] args) { 
    var myArray = new short[5, 10, 20]; 

    short z = 0; 

    for (int i = 0; i < myArray.GetLength(0); i++) { 
     for (int j = 0; j < myArray.GetLength(1); j++) { 
      for (int k = 0; k < myArray.GetLength(2); k++) { 
       myArray[i, j, k] = z; 
       z++; 
      } 
     } 
    } 

    // myArray[1, 2, 3] == 243 

    fixed (short* ptr = myArray) { 
     Func(ptr, myArray.GetLength(0), myArray.GetLength(1), myArray.GetLength(2)); 
    } 
} 

// To convert to C/C++ take away the static unsafe 
static unsafe void Func(short* myArray, int size1, int size2, int size3) { 
    int x = 1, y = 2, z = 3; 
    int el = myArray[x * size2 * size3 + y * size3 + z]; // el == 243 
} 
İlgili konular