使用2D托管和非托管2D数组
本文关键字:2D 数组 使用 | 更新日期: 2023-09-27 18:13:03
我正在做一个项目,需要我在c#和非托管c++之间传递2D数组。
我需要为2D整数数组和2D浮点数组做这个,但现在我被困在2D整数数组上。
我有一个模式的1D整数数组工作得很好....
我的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方法,如下所示:
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
谁能看到/解释我做错了什么,需要做什么来纠正这个代码?我有一段时间没有编码了,我确实花了相当长的时间在谷歌上寻找解决方案,但不能完全得到这个工作的期望。
如有任何指导,我们将不胜感激。
Doug<标题> 更多信息
- 如果我改变索引在非托管代码使用一个单一的索引(从0到9),而不是一个2D索引(0,0到4,1),那么所有的值被正确更新
- 在调试器中,当我查看每个数组值[x,y]的地址时-它们都显示完全相同的地址
- 使用2D数组索引,似乎第一个索引被完全忽略了-只有第二个索引被使用,因为这从0到1变化,代码只是覆盖前两个数组值。
- 这告诉我,我确实可以访问非托管代码中数组的正确内存,但我不能使用2D索引来访问它。这是一个痛苦,必须解决。
c++没有二维数组。逗号运算符把(4,0)变成0,所以my2DIntArray[4,0]
等价于my2DIntArray[0]
。
由于my2DIntArray
是一个指向一维数组的指针,您必须通过手动计算索引来模拟二维:my2DIntArray[line * columns + column]