因为在C++中使用 int [],, int *>代码>不是C++中的正确对应类型。代码> INT[][]/COD>是一组INTS,类似于C++中的代码> INT**/COD>而int[,]是一个具有二维索引的int数组:index=x+y*width。在C#/C++互操作中使用int**是很困难的,因为您有许多指向托管或非托管内存的指针,这些内存不能从一个内存直接访问到另一个内存(请参阅下文),c#,c++,arrays,cuda,C#,C++,Arrays,Cuda" /> 因为在C++中使用 int [],, int *>代码>不是C++中的正确对应类型。代码> INT[][]/COD>是一组INTS,类似于C++中的代码> INT**/COD>而int[,]是一个具有二维索引的int数组:index=x+y*width。在C#/C++互操作中使用int**是很困难的,因为您有许多指向托管或非托管内存的指针,这些内存不能从一个内存直接访问到另一个内存(请参阅下文),c#,c++,arrays,cuda,C#,C++,Arrays,Cuda" />

在C#和C+之间发送2D int数组+; 我试图创建一个解决方案,通过CUDA可以在C程序中运行2D int数组,所以我现在尝试尝试的方法是创建一个C++ DLL,它可以处理CUDA代码,然后返回2D数组。下面是我用来将数组发送到dll并返回的代码 #include "CudaDLL.h" #include <stdexcept> int** cudaArrayData; void CudaDLL::InitialiseArray(int arrayRows, int arrayCols, int** arrayData) { cudaArrayData = new int*[arrayCols]; for(int i = 0; i < arrayCols; i++) { cudaArrayData[i] = new int[arrayRows]; } cudaArrayData = arrayData; } int** CudaDLL::ReturnArray() { return cudaArrayData; } #包括“cudadell.h” #包括 国际**cudaArrayData; void cudadell::InitialiseArray(int arrayRows、int arrayCols、int**arrayData) { cudaArrayData=新整数*[arrayCols]; for(int i=0;i < P>因为在C++中使用 int [],, int *>代码>不是C++中的正确对应类型。代码> INT[][]/COD>是一组INTS,类似于C++中的代码> INT**/COD>而int[,]是一个具有二维索引的int数组:index=x+y*width。在C#/C++互操作中使用int**是很困难的,因为您有许多指向托管或非托管内存的指针,这些内存不能从一个内存直接访问到另一个内存(请参阅下文)

在C#和C+之间发送2D int数组+; 我试图创建一个解决方案,通过CUDA可以在C程序中运行2D int数组,所以我现在尝试尝试的方法是创建一个C++ DLL,它可以处理CUDA代码,然后返回2D数组。下面是我用来将数组发送到dll并返回的代码 #include "CudaDLL.h" #include <stdexcept> int** cudaArrayData; void CudaDLL::InitialiseArray(int arrayRows, int arrayCols, int** arrayData) { cudaArrayData = new int*[arrayCols]; for(int i = 0; i < arrayCols; i++) { cudaArrayData[i] = new int[arrayRows]; } cudaArrayData = arrayData; } int** CudaDLL::ReturnArray() { return cudaArrayData; } #包括“cudadell.h” #包括 国际**cudaArrayData; void cudadell::InitialiseArray(int arrayRows、int arrayCols、int**arrayData) { cudaArrayData=新整数*[arrayCols]; for(int i=0;i < P>因为在C++中使用 int [],, int *>代码>不是C++中的正确对应类型。代码> INT[][]/COD>是一组INTS,类似于C++中的代码> INT**/COD>而int[,]是一个具有二维索引的int数组:index=x+y*width。在C#/C++互操作中使用int**是很困难的,因为您有许多指向托管或非托管内存的指针,这些内存不能从一个内存直接访问到另一个内存(请参阅下文),c#,c++,arrays,cuda,C#,C++,Arrays,Cuda,然而,问题是我在C#返回时遇到一个错误,“无法封送‘返回值’:无效的托管/非托管类型组合。”我的希望是,如果我将数组作为指针返回,C#可能会理解并接受它,但没有这样的运气 什么想法?< /P> < P>因为在C++中使用 int [],, int *>代码>不是C++中的正确对应类型。代码> INT[][]/COD>是一组INTS,类似于C++中的代码> INT**/COD>而int[,]是一个具有二维索引的int数组:index=x+y*width。在C#/C++互操作中使用int**是很困难

然而,问题是我在C#返回时遇到一个错误,“无法封送‘返回值’:无效的托管/非托管类型组合。”我的希望是,如果我将数组作为指针返回,C#可能会理解并接受它,但没有这样的运气


什么想法?< /P> < P>因为在C++中使用<代码> int [],,<代码> int *>代码>不是C++中的正确对应类型。代码> INT[][]/COD>是一组INTS,类似于C++中的代码> INT**/COD>而

int[,]
是一个具有二维索引的int数组:
index=x+y*width
。在C#/C++互操作中使用
int**
是很困难的,因为您有许多指向托管或非托管内存的指针,这些内存不能从一个内存直接访问到另一个内存(请参阅下文)

已在
InitialiseArray(…,int**arrayData)
中读取内存中的某个位置,但不在数组值中,因为不传递带有指向int数组指针的数组,所以只传递一个int数组

当您在ReturnArray()中返回
int**
时,您的问题是.net不知道如何解释指向指针的指针

修复此,在C++侧只使用代码> int */CODE,不要将数组作为函数返回值返回,这只会给你一个指向非托管数组的指针,而不是管理内存中的整个数据。可以从C#使用此选项,但可能不是您想要的方式。使用C#中分配的数组作为

void ReturnArray(int*retValues)
中的函数参数将数据复制到

另一个问题是数据复制和内存分配。如果使用C#right处理内存,即禁止垃圾收集器移动数据(清理未使用的对象时会这样做),则可以避免所有这些步骤。要么使用固定的{}语句,要么通过GCHandle.Alloc(数组,GCHandleType.pinted)手动执行。这样做,你可以直接使用C++内分配的数组。
最后,如果您只需要让CUDA内核在您的C#数据上运行,那么可以看看一些CUDA包装器,它们可以为您处理所有Pinvoke危害。比如(我维护这个项目)或者其他一些

你的C代码是什么样子的?你用的是int[][]还是int[,]?int[,]我应该用int[][]吗?我不知道有什么不同?非常感谢你,我会进一步研究,因为这是我目前未知的领域哈哈。