2014-07-16 1 views
0

저는 C#과 비 관리 C++간에 2D 배열을 전달해야하는 프로젝트를 진행하고 있습니다.2D 관리 및 비 관리 2D 배열로 작업

2D 정수 배열 모래 2D 플로트 배열에 대해이 작업을 수행해야하지만 지금은 2D 정수 배열에 고정되어 있습니다.

나는

내 데모 C# 코드는이

// Test 2D integer Array 
int[,] cs2DIntArray = new int[5,2]; 
cs2DIntArray[0, 0] = 0; 
cs2DIntArray[0, 1] = 1; 
cs2DIntArray[1, 0] = 10; 
cs2DIntArray[1, 1] = 11; 
cs2DIntArray[2, 0] = 20; 
cs2DIntArray[2, 1] = 21; 
cs2DIntArray[3, 0] = 30; 
cs2DIntArray[3, 1] = 31; 
cs2DIntArray[4, 0] = 40; 
cs2DIntArray[4, 1] = 41; 


int my2DArrayIntReturn = tess.test2DIntArray(cs2DIntArray, 5, 2); 

"TESS"처럼 보이는 것입니다 관리되는 C++ 래퍼 클래스를하고 test2DIntArray를 구현 .... 잘 작동하는 1 차원 정수 배열의 패턴을 가지고 이 같은 방법

int test2DIntArray(array<int, 2>^ my2DIntArray, int rows, int columns){ 

    using System::Runtime::InteropServices::GCHandle; 
    using System::Runtime::InteropServices::GCHandleType; 

    GCHandle my2DIntArrayGCHandle = GCHandle::Alloc(my2DIntArray,GCHandleType::Pinned); 
    IntPtr my2DIntArrayPtr = my2DIntArrayGCHandle.AddrOfPinnedObject(); 

    my2DIntArray[0, 0] = 0; 
    my2DIntArray[0, 1] = 11; 
    my2DIntArray[1, 0] = 110; 
    my2DIntArray[1, 1] = 111; 
    my2DIntArray[2, 0] = 120; 
    my2DIntArray[2, 1] = 121; 
    my2DIntArray[3, 0] = 130; 
    my2DIntArray[3, 1] = 131; 
    my2DIntArray[4, 0] = 140; 
    my2DIntArray[4, 1] = 141; 

    return pu->uTest2DIntArray((int*)my2DIntArrayPtr.ToPointer(),rows,columns); 

}; 

PU는 관리되지 않는 클래스이며,이

같은 uTest2DIntArray를 구현
int UnmanagedModel::uTest2DIntArray(int* my2DIntArray, int arrayRows, int arrayColumns) 
{ 

      my2DIntArray[0,0] = 20; 
      my2DIntArray[0,1] = 21; 
      my2DIntArray[1,0] = 210; 
      my2DIntArray[1,1] = 211; 
      my2DIntArray[2,0] = 220; 
      my2DIntArray[2,1] = 221; 
      my2DIntArray[3,0] = 230; 
      my2DIntArray[3,1] = 231; 
      my2DIntArray[4,0] = 240; 
      my2DIntArray[4,1] = 241; 




     return my2DIntArray[1,1]; 


} 

오류 및 경고없이 컴파일되고 실행되지만 코드가 C#으로 돌아 오면 [0,0] 및 [0,1]의 처음 두 값만 아래의 비 관리 코드 값 변경 내용을 반영합니다 . 다른 모든 값은 관리되는 C++ 메소드의 변경 사항을 반영합니다.

cs2DIntArray {int[5, 2]} int[,] 
     [0, 0] 240 int 
     [0, 1] 241 int 
     [1, 0] 110 int 
     [1, 1] 111 int 
     [2, 0] 120 int 
     [2, 1] 121 int 
     [3, 0] 130 int 
     [3, 1] 131 int 
     [4, 0] 140 int 
     [4, 1] 141 int 

누구나 내가 뭘 잘못하고 무엇을 설명해야합니까?이 코드를 수정하려면 어떻게해야합니까? 나는 잠시 코딩을하지 않았으며 Google에서 솔루션을 찾기 위해 많은 시간을 보냈지 만 원하는대로이 작업을 수행 할 수는 없습니다.

모든 안내를 기꺼이 받아 보겠습니다.

추가 정보

  1. I 대신 2D 지수 (0,0 4,1을 중 (0에서 9) 하나의 인덱스를 사용하는 관리 코드의 인덱스를 변경하면) 그러면 모든 값이 올바르게 업데이트됩니다.
  2. 디버거에서 각 배열 값 [x, y]의 주소를 볼 때 모두 정확히 동일한 주소를 표시합니다.
  3. 2D 배열 색인을 사용하면 첫 번째 색인은 완전히 무시되고있다 - 유일한 두 번째 색인 ex가 사용되고 0에서 1까지 다양하기 때문에 코드는 처음 두 배열 값을 덮어 쓰는 것입니다.
  4. 내 관리되지 않는 코드 내에서 배열에 대한 올바른 메모리에 액세스 할 수 있다고 알려주지 만 2D 인덱싱을 사용하여 가져올 수 없습니다. 어느 것이 고통이며 고칠 수 있어야합니다.

답변

0

C++에는 2 차원 배열이 없습니다. 쉼표 연산자는 4,0을 0으로 변환하므로 my2DIntArray[4,0]my2DIntArray[0]과 같습니다. my2DIntArray[line * columns + column]

+0

고맙습니다 @youdontneedtothankme이 ..... : 귀하의 설명 내 연구 결과를 정확히 일치 : my2DIntArray 이후

는 1 차원 배열에 대한 포인터입니다, 당신은 수동으로이 같은 인덱스를 계산하여 2 차원 시뮬레이션 할 수 있습니다 . 언 매니지드 C++ 코드에서 2D 배열 인덱싱을 사용할 수 있도록 코드를 조정할 수있는 방법에 대한 아이디어가 있습니까? – scotsman60