将2D数组从托管C++传递到非托管C++
passing 2D array from managed C++ to unmanaged C++
我正在为非托管C++代码开发一个托管C++包装器,有一个问题。为了简单起见,我们假设我需要将一个2D数组从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类的指针。我现在得到的错误如下:
尝试读取或写入受保护的内存。这通常表示其他内存已损坏。
任何想法都值得赞赏。
void MNumeric::ChangeArray(cli::array<int,2>^arr,int mySize){pin_ptr<int>p=&arr[0,0];//指向arr中第一个元素的pin指针int*np=p;//指向arr中第一个元素的指针UNumeric::ChangeArray((int**)np,mySize);}
此处不应使用强制转换,因为它可能会隐藏潜在的重要警告。值得注意的是,2D阵列不能转换为int**
。int**
是指向指针数组的指针。int*[]
是指向数组的数组的指针。您有一个函数,它接受指针的数组。它需要一个托管的int[][]
,而不是int[,]
。如果你没有抛出,你的编译器会因为你试图这样做而对你大喊大叫。
相关文章:
- 2D数组来自文本输入,中间有空格
- 将值指定给向量(2D)的向量中的某个位置
- 如何使用用户输入在C++中正确填充2D数组
- 如何在C++中检查2D数组中负值的输入验证
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 在 2D 向量中使用第三个 [ ] 有什么意义?
- 四边形的 2D 旋转
- 打印第二列时的2d字符矢量打印空间
- 如何将以逗号和空格分隔的整数读取到 2D 数组中?
- 如何在C++函数中声明静态 2D 数组?
- 我是 C++ 的初学者,我想知道如何在 2D 矢量中获取重复值
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- opengl glBegin(GL_LINES) 和 glBegin(GL_POINT) 在 2D 中不可视化点矢量
- 在C++中迭代 2D 容器的最干净方法
- 如何引用 2D 指针?
- 如何在 C++ 中使用它的构造函数初始化 unique_ptrs 的 2D 向量?
- C++动态安全 2D 交错阵列
- 如何在C++或OpenCV子矩阵中的2D子向量上使用OpenACC?
- 我已经阅读了很多关于 2d 数组的信息,但我在作业中使用它时遇到了麻烦
- 将 2D 推力::d evice_vector 复矩阵传递给 CUDA 内核函数