使用二维数组调用返回结构
PInvoke return struct with two dimensions array
我有在c ++ Win32 DLL中定义的结构,如下所示:
typedef struct matrix
{
double** data;
int m;
int n;
} Matrix;
还有一个功能:
Matrix getMatrix(void);
Matrix getMatrix()
{
Matrix mat;
mat.m = 2;
mat.n = 2;
mat.data = (double**) malloc (sizeof(double*) * 4);
mat.data[0] = (double* ) malloc (sizeof(double) * 2);
mat.data[1] = (double* ) malloc (sizeof(double) * 2);
mat.data [0][0]=1;
mat.data [0][1]=2;
mat.data [1][0]=3;
mat.data [1][1]=4;
return mat;
}
如何捕获此函数的返回值(如果我使用的是 C# 应用程序中的P/Invoke
)
我不确定它是否有效,但从内存中: 将数据声明为 IntPtr 并使用它:
static double[][] FromNative (IntPtr data, int m,int n)
{
var matrix=new double[m][];
for(int i=0;i<m;i++)
{
matrix[i]=new double[n];
Marshal.Copy(Marshal.ReadIntPtr(data),matrix[i],0,n);
data =(IntPtr)(data.ToInt64()+IntPtr.Size);
}
return matrix;
}
答案很短但令人失望:您必须将多维数组转换为一维数组。
使用 AllocHGlobal 有一个答案:将多维数组从托管代码传递到非托管代码
此解决方案执行类似操作,但在 C# 定义中,您必须使data
字段为 IntPtr 类型,而在非托管代码中,您必须假定它是一个一维数组。
还有另一种使用Marshal.UnsafeAddrOfPinnedArrayElement
的解决方案(MSDN 和 StackOverflow),但它仍然假设您使用的是一维数组。
如果您告诉您要解决的问题是什么,那么更好的选择就会随之而来。它是纯粹的返回一个非常重要的功能并忘记这个 PInvoke 还是您正在尝试进行持续的双向编组?
相关文章:
- 在类中返回结构时出现问题
- 在 C 函数中返回结构会导致分段错误
- 如何从函数返回结构
- c++优化地返回结构和向量
- 从函数 BY VALUE 返回数组,返回结构时会发生什么?
- C++,使用 if/else 返回结构中的值
- 如何在C++中返回结构?
- 难以从另一个结构中的函数返回结构
- 返回结构的方法的正确语法是什么
- C++ 使用成员函数返回结构体指针属性的值
- 什么安全?从函数返回结构或指针
- 为什么要定义一个返回结构的 lambda 函数,而不是直接定义结构
- C 如何将数据文件读取到结构或向量以及返回结构或向量
- 从线程执行的函数中返回结构数组
- 取决于参数的数量,将其返回结构对象,并将其分配给常规结构的对象
- 返回结构数组 c++
- 如何从 C++ 中的函数返回结构
- 从类的方法返回结构中的值
- 如何从C 中的类返回结构
- 返回结构的特定值