将2D数组从托管C++传递到非托管C++

本文关键字:C++ 2D 数组 | 更新日期: 2023-09-27 17:59:25

我正在为非托管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类的指针。我现在得到的错误如下:

尝试读取或写入受保护的内存。这通常表示其他内存已损坏。

任何想法都值得赞赏。

将2D数组从托管C++传递到非托管C++

void MNumeric::ChangeArray(cli::array&ltint,2>^arr,int mySize){pin_ptr&ltint>p=&arr[0,0];//指向arr中第一个元素的pin指针int*np=p;//指向arr中第一个元素的指针UNumeric::ChangeArray((int**)np,mySize);}

此处不应使用强制转换,因为它可能会隐藏潜在的重要警告。值得注意的是,2D阵列不能转换为int**int**是指向指针数组的指针。int*[]是指向数组的数组的指针。您有一个函数,它接受指针的数组。它需要一个托管的int[][],而不是int[,]。如果你没有抛出,你的编译器会因为你试图这样做而对你大喊大叫。