将Delphi 2D动态数组传递给C DLL

时间:2016-03-09 17:17:48

标签: matlab delphi dll pass-by-reference

我正在尝试使用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);

1 个答案:

答案 0 :(得分:0)

double* input2D

这是指向double数组的指针。但是你传递了它

in2d: T2DArrayOfDouble

是指向double数组的指针数组的指针。

换句话说,您将double**传递给期望double*的参数。

通过更改

解决问题
in2d: T2DArrayOfDouble

in2d: TDynArrayOfDouble

显然,您必须更改SetLength以匹配,以及填充数组的代码。虽然人们想知道是否存在更深层次的问题,因为参数名称表明,与类型相反,它是一个二维数组。