导入C ++ DLL的问题

时间:2011-05-17 16:04:38

标签: c# c++ dllimport

我试图从我的程序中的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]

可能会发生什么?

3 个答案:

答案 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)

matmat[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);