2011-06-15 259 views
2

我正在爲託管C++包裝器處理非託管C++代碼並且有一個問題。 只是爲了簡單,讓我們說我需要從C#代碼傳遞二維數組到託管C++到非託管C++。我對1D陣列沒有問題,但堅持2D版本。可以將它轉換爲1D,但我想看看是否有其他方法。將二維數組從託管C++傳遞到非託管C++

爲了簡單起見,假設我想使用中間包裝將二維數組發送到非託管代碼並更改其值。

所以這裏是C#代碼到託管C++的電話:

MNumeric wrapper = new MNumeric(); //managed C++ object 
int[,] dArr = new int[10, 10]; 
for (int i = 0; i < 10; i++) 
     { 
      for (int j = 0; j < 10; j++) 
      { 
       dArr[i, j] = 10; 
      } 
     } 
wrapper.ChangeArray(dArr, Convert.ToInt32(Math.Sqrt(dArr.Length))) 

託管C++:

void MNumeric::ChangeArray(cli::array<int,2> ^arr, int mySize) 
{ 
     //some code to call Unmanaged C++ passing managed 2D array ??? 
} 

非託管C++

void UNumeric::ChangeArray(int** arr, int mySize) 
{ 
    for(int i=0;i<mySize;i++) 
    { 
     for(int j=0;j<mySize;j++) 
     { 
      arr[i][j]=i; 
     } 
    } 
} 

非常感謝你的幫助。

看起來像我修復一個錯誤,但得到了另一個。我的C++託管代碼現在看起來像這樣。

void MNumeric::ChangeArray(cli::array<int,2> ^arr, int mySize) 
{ 
    pin_ptr<int> p_arr = &arr[0,0]; 
    u_num->ChangeArray((int**)p_arr, mySize);   
} 

其中u_num只是指向UNumeric類的指針。 我現在得到的錯誤如下:

試圖讀取或寫入受保護的內存。這通常表明其他內存已損壞。

任何想法讚賞。

+0

你的問題是什麼?你怎麼能這樣做?這可能嗎?上述所有的? – RLH 2011-06-15 15:43:05

+0

我認爲這可以做到,所以問題是如何做到這一點。 – ilyaw77 2011-06-15 16:08:36

回答

3
 
void MNumeric::ChangeArray(cli::array&ltint,2> ^arr, int mySize) 
{ 
    pin_ptr&ltint> p = &arr[0,0]; // pin pointer to first element in arr 
    int* np = p; // pointer to the first element in arr 
    UNumeric::ChangeArray((int**)np, mySize); 
} 
+0

亞歷克斯,感謝您的回覆,但這種解決方案不起作用。 pin_ptr p =&arr [0] [0]行拋出錯誤C3262:無效數組索引:爲二維指定的1維(cli :: array <類型,維> ^' – ilyaw77 2011-06-15 16:07:16

+0

Alex,我能夠修復這個問題使用pin_ptr p_arr =&arr [0,0];因爲它是2d數組而不是參差不齊的數組。代碼現在編譯好了,但是當我嘗試運行時,我在u_num-> ChangeArray((int **)np,mySize)行上得到了AccessViolationException。 – ilyaw77 2011-06-15 16:45:19

+0

@ lyaw77:在我的答案中用mySize替換arr-> Length。 – 2011-06-15 17:29:34

2

你不應該在這裏使用劇組,它可能會隱藏潛在的重要警告。值得注意的是,2D陣列是而不是可轉換爲int**int**是指向指針的數組的指針int*[]是指向數組陣列的指針。你有一個函數需要一組指針。它想要一個託管int[][],而不是一個int[,]。如果你沒有鑄造的話,你的編譯器會徹底地向你大喊,試圖這樣做。

+0

謝謝你的回覆。我已經嘗試過這種方式,但有同樣的錯誤:在C#中我有:int [] [] dArr = new int [10] []; in Managed C++:void MNumeric :: ChangeArray(cli :: array ^>^arr,int mySize){pin_ptr p_arr =&arr [0] [0]; u_num-> ChangeArray((int **)p_arr,mySize) ;},我仍然有同樣的錯誤。 – ilyaw77 2011-06-15 20:30:09

+0

@ ilyaw77:那是因爲你從來沒有分配第二批數組。您分配了一個指針數組,然後從不將這些指針設置爲指向任何位置。哦,並*取出演員*。 – Puppy 2011-06-16 10:05:25

+0

感謝您的建議,我可以使用GCHandle類來做到這一點。 – ilyaw77 2011-06-16 19:33:26