我正在为非托管C ++代码编写托管C ++包装器并且有一个问题。 为简单起见,我要说我需要将一个二维数组从C#代码传递给托管C ++到非托管C ++。我对1D阵列没有问题,但坚持使用2D版本。可以选择将其转换为1D,但我想看看是否有其他方法。
为简单起见,我想使用中间包装器将2D数组发送到非托管代码并更改其值。
所以这里是调用托管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 :(得分:3)
void MNumeric::ChangeArray(cli::array<int,2> ^arr, int mySize) { pin_ptr<int> 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); }
答案 1 :(得分:2)
你不应该在这里使用演员表,它可能会隐藏潜在的重要警告。值得注意的是,2D阵列不可转换为int**
。 int**
是指向指针数组的指针。 int*[]
是指向数组数组的指针。你有一个带有指针数组的函数。它需要托管int[][]
,而不是int[,]
。如果你没有投入,你的编译器会彻底嘲笑你。