C# 导入C++;动态链接库 我试图从程序中的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]; }

C# 导入C++;动态链接库 我试图从程序中的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]; },c#,c++,dllimport,C#,C++,Dllimport,调用如下所示 tred2(tensor, eigenValues, eigenVectors); 其中张量为float[,],特征值和特征向量为float[]数组 当我尝试这样做时,我得到一个例外 Access violation reading location 0x3f5dce99 当我尝试访问 float a = mat[0][0] 可能会发生什么?无论是mat还是mat[0]都是错误的指针。问题在于分配mat的代码mat或mat[0]是错误的指针。问题在于分配三对角3(float*

调用如下所示

tred2(tensor, eigenValues, eigenVectors);
其中张量为
float[,]
,特征值和特征向量为
float[]
数组

当我尝试这样做时,我得到一个例外

Access violation reading location 0x3f5dce99
当我尝试访问

float a = mat[0][0]

可能会发生什么?

无论是
mat
还是
mat[0]
都是错误的指针。问题在于分配
mat
的代码
mat
mat[0]
是错误的指针。问题在于分配三对角3(float**mat,float*diag,float*subd)

mat是双指针类型(指针到指针)。 在C#中,float[,]不是双指针。它只是访问多维数组的语法糖,就像您使用
mat[x+y*width]
而不是
mat[y][x]

换句话说,您正在将“代码>浮点*/CODE >传递给C++应用程序,而不是<代码>浮点**/COD> < < /P> 您应该更改使用

mat
使用手动偏移访问元素的方式,如
mat[y+2*x]
Tridiagonal3(float**mat,float*diag,float*subd)

mat是双指针类型(指针到指针)。 在C#中,float[,]不是双指针。它只是访问多维数组的语法糖,就像您使用
mat[x+y*width]
而不是
mat[y][x]

换句话说,您正在将“代码>浮点*/CODE >传递给C++应用程序,而不是<代码>浮点**/COD> < < /P>


您应该更改使用
mat
使用手动偏移量访问元素的方式,如
mat[y+2*x]

您需要首先分配一个包含3个指针的数组,这些指针可以使用类来完成:

class Pointer3
{
     IntPtr p1, p2, p3;
}
class Row3
{
     float a, b, c;
}
然后需要使用类定义一行:

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

您需要首先分配一个包含3个指针的数组,这些指针可以使用类来完成:

class Pointer3
{
     IntPtr p1, p2, p3;
}
class Row3
{
     float a, b, c;
}
然后需要使用类定义一行:

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

作为参数传入的是什么?看起来阵列尚未分配。为什么不发布呼叫站点代码?顺便问一下,
float[,]
是什么?@Nawaz:
float[,]
是C#中的一个多维数组。@Nawaz:
float[,]
是一个
float
的二维数组。如果你不给我们看你的P/Invoke代码,我们可以开始回答这个问题吗?你会把什么作为参数传入?看起来阵列尚未分配。为什么不发布呼叫站点代码?顺便问一下,
float[,]
是什么?@Nawaz:
float[,]
是C#中的多维数组。@Nawaz:
float[,]
float
的二维数组。如果你不给我们看你的P/Invoke代码,我们可以开始回答这个问题吗?