저는 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에서 솔루션을 찾기 위해 많은 시간을 보냈지 만 원하는대로이 작업을 수행 할 수는 없습니다.
모든 안내를 기꺼이 받아 보겠습니다.
덕
추가 정보
- I 대신 2D 지수 (0,0 4,1을 중 (0에서 9) 하나의 인덱스를 사용하는 관리 코드의 인덱스를 변경하면) 그러면 모든 값이 올바르게 업데이트됩니다.
- 디버거에서 각 배열 값 [x, y]의 주소를 볼 때 모두 정확히 동일한 주소를 표시합니다.
- 2D 배열 색인을 사용하면 첫 번째 색인은 완전히 무시되고있다 - 유일한 두 번째 색인 ex가 사용되고 0에서 1까지 다양하기 때문에 코드는 처음 두 배열 값을 덮어 쓰는 것입니다.
- 내 관리되지 않는 코드 내에서 배열에 대한 올바른 메모리에 액세스 할 수 있다고 알려주지 만 2D 인덱싱을 사용하여 가져올 수 없습니다. 어느 것이 고통이며 고칠 수 있어야합니다.
고맙습니다 @youdontneedtothankme이 ..... : 귀하의 설명 내 연구 결과를 정확히 일치 :
my2DIntArray
이후는 1 차원 배열에 대한 포인터입니다, 당신은 수동으로이 같은 인덱스를 계산하여 2 차원 시뮬레이션 할 수 있습니다 . 언 매니지드 C++ 코드에서 2D 배열 인덱싱을 사용할 수 있도록 코드를 조정할 수있는 방법에 대한 아이디어가 있습니까? – scotsman60