2011-08-22 28 views
8

Tôi muốn làm như sau:đa đèo - mảng chiều từ mã được quản lý để mã unmanaged

  1. Tạo ba mảng dimesinal trong C# mã như thế này:

    var myArray = new short[x,y,z]; 
    UnanagedFunction(myArray); 
    
  2. Vượt qua nó để mã không được quản lý (C++) như sau:

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

CẬP NHẬT Khi tôi cố gắng đoạn mã sau tôi có lỗi runtime:

Attempted to read or write to protected memory.

Cảm ơn bạn !!!

+0

Bạn không thể viết mã như thế trong C++. –

+0

phần đầu tiên của mã là trong C# thứ hai là trong c + + và tôi đã thử nó bây giờ trình biên dịch cho phép tôi mã C++ –

+1

Có lẽ bạn có thể thay đổi mã của bạn thành một mảng ba. – Simon

Trả lời

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

này đã được thử nghiệm và nó hoạt động, hạn chế duy nhất là bạn có để gọi Marshal.FreeHGlobal trên con trỏ mảng khi bạn hoàn thành nó hoặc bạn sẽ bị rò rỉ bộ nhớ, tôi cũng khuyên bạn nên thay đổi hàm C++ để nó chấp nhận kích thước mảng hoặc bạn sẽ chỉ có thể sử dụng mảng 3D cụ thể size

+0

Cảm ơn bạn rất nhiều! !! –

2

Tôi đang viết nó bằng C# thuần túy, nhưng nếu bạn lấy đi unsafe static từ Func, thì Func sẽ hoạt động trong C/C++. Hãy nhận biết rằng tôi lưu ý chắc chắn rằng nó là ok ok để viết :-) này Tôi đang sử dụng này 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 
} 
Các vấn đề liên quan