微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决将2D数组从托管C ++传递到非托管C ++

| 我正在为非托管C ++代码开发托管C ++包装程序,并且有一个问题。 为了简单起见,假设我需要将2D数组从C#代码传递到Managed C ++,再传递到Unmanaged 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,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&ltint,2> ^ arr,int mySize) {     pin_ptr&ltint> p =&arr [0,0]; //将指针指向arr中的第一个元素     int * np = p; //指向arr中第一个元素的指针     UNumeric :: ChangeArray((int **)np,mySize); }     ,        您不应该在此使用强制转换,它可能隐藏潜在的重要警告。值得注意的是,二维数组不能转换为
int**
int**
是指向指针数组的指针。 “ 6”是指向数组数组的指针。您有一个采用指针数组的函数。它需要托管的
int[][]
,而不是
int[,]
。如果您没有进行转换,那么您的编译器会彻底喊您尝试这样做。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。