我正在尝试使用C编写的DLL,包装Matlab DLL。
该函数在C中定义为:
int wmlfLevel1(double* input2D, int size, char* message, double** output2d)
我的Delphi函数定义为:
func: function (input2d: pDouble; size: integer; messag: PAnsiChar; output2d: ppDouble): integer; cdecl;
我已经定义了这些类型以将矩阵传递给DLL:
type
TDynArrayOfDouble = array of double;
type
T2DDynArrayOfDouble = array of TDynArrayOfDouble;
type
ppDouble = ^pDouble;
我正在调用DLL函数:
var
in2d: T2DDynArrayOfDouble;
size: integer;
msg: PAnsiChar;
out2d: T2DDynArrayOfDouble;
begin
size:= 3;
SetLength(in2d, size, size);
SetLength(out2d, size, size);
in2d[0][0]:= 1; ... // init matrix values
func(pDouble(in2d), size, msg, ppdouble(out2d));
问题是输出矩阵包含大量不正确的值(应包含输入矩阵乘以2)。
我错过了什么?
我可以使用带有以下代码的静态数组成功调用此DLL函数:
type
T2DArrayOfDouble = array [0..2, 0..2] of double;
type
pT2DArrayOfDouble = ^T2DArrayOfDouble;
type
ppT2DArrayOfDouble = ^pT2DArrayOfDouble;
func: function (input2d: pT2DArrayOfDouble; size: integer; messag: PAnsiChar; output2d: ppT2DArrayOfDouble): integer; cdecl;
...
var
in2d: T2DArrayOfDouble;
size: integer;
msg: PAnsiChar;
out2d: pT2DArrayOfDouble;
begin
size:= High(in2d) + 1;
in2d[0][0]:= 1; ... // init matrix values
func(@in2d, size, msg, @out2d);
答案 0 :(得分:0)
double* input2D
这是指向double数组的指针。但是你传递了它
in2d: T2DArrayOfDouble
是指向double数组的指针数组的指针。
换句话说,您将double**
传递给期望double*
的参数。
通过更改
解决问题in2d: T2DArrayOfDouble
到
in2d: TDynArrayOfDouble
显然,您必须更改SetLength
以匹配,以及填充数组的代码。虽然人们想知道是否存在更深层次的问题,因为参数名称表明,与类型相反,它是一个二维数组。