我试图从我的程序中的C#代码访问这个C ++函数
Tridiagonal3 (float** mat, float* diag, float* subd)
{
float a = mat[0][0], b = mat[0][1], c = mat[0][2],
d = mat[1][1], e = mat[1][2],
f = mat[2][2];
}
电话会议如下所示
tred2(tensor, eigenValues, eigenVectors);
其中张量为float[,]
,特征值和特征向量为float[]
个数组。
当我尝试这样做时,我得到一个例外
Access violation reading location 0x3f5dce99
当我尝试访问
时float a = mat[0][0]
可能会发生什么?
答案 0 :(得分:5)
Tridiagonal3 (float** mat, float* diag, float* subd)
mat是双指针类型(指向指针的指针)。
在C#中,float [,]是而不是一个双指针。它只是用于访问多维数组的语法糖,就像你mat[x + y * width]
而不是mat[y][x]
一样;
换句话说,您将float*
传递给C ++应用程序,而不是float**
。
您应该使用手动偏移更改使用mat
访问元素的方式,例如mat[y + 2 * x]
答案 1 :(得分:0)
mat
或mat[0]
都是错误的指针。问题在于分配mat
的代码。
答案 2 :(得分:0)
您需要先分配一个带有3个指针的数组,这些指针可以使用类来完成:
class Pointer3
{
IntPtr p1, p2, p3;
}
然后你需要使用类定义一行:
class Row3
{
float a, b, c;
}
C#中的所有内容。然后你需要分配它们:
Row3 row1, row2, row3;
// todo: init values
Pointer3 mat;
// allocate place for the rows in the matrix
mat.p1 = Marshal.AllocHGlobal(sizeof(Row3));
mat.p2 = Marshal.AllocHGlobal(sizeof(Row3));
mat.p3 = Marshal.AllocHGlobal(sizeof(Row3));
// store the rows
Marshal.StructureToPtr(row1, mat.p1, false);
Marshal.StructureToPtr(row2, mat.p2, false);
Marshal.StructureToPtr(row3, mat.p3, false);
// allocate pointer for the matrix
IntPtr matPtr = Marshal.AllocHGlobal(sizeof(Pointer3));
// store the matrix in the pointer
Marsha.StructureToPtr(mat, matPtr, false);
现在使用matPtr
作为矩阵来调用函数是安全的
要从修改后的矩阵中获取值:
Marshal.PtrToStructure(matPtr, mat);