Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要帮助从Delphi正确调用C函数吗_C_Arrays_Delphi_Pointers_Dll - Fatal编程技术网

需要帮助从Delphi正确调用C函数吗

需要帮助从Delphi正确调用C函数吗,c,arrays,delphi,pointers,dll,C,Arrays,Delphi,Pointers,Dll,我正在Delphi中静态导入一个动态库(DLL),并尝试访问它的函数 下面是我试图访问的特定C函数: int flann_radius_search_double (flann_index_t index_ptr, /* the index */ double* query, /* query point */ int* indices, /* array for st

我正在Delphi中静态导入一个动态库(DLL),并尝试访问它的函数

下面是我试图访问的特定C函数:

int flann_radius_search_double (flann_index_t index_ptr, /* the index */
                                double* query, /* query point */
                                int* indices, /* array for storing the indices found (will be modified) */
                                double* dists, /* similar, but for storing distances */
                                int max_nn,  /* size of arrays indices and dists */
                                float radius, /* search radius (squared radius for euclidian metric) */
                                struct FLANNParameters* flann_params);
以下是我在Delphi中的减速:

function flann_radius_search_double(index_ptr: flann_index_t;
  var query: double; var indices: longint; var dists: double;
  max_nn: longint; radius: single; var flann_params: FLANNParameters): longint;
  cdecl; external External_library Name 'flann_radius_search_double';   
我访问的函数如下:

  type
  TDoubleArray = array[0..1000] of double;
  PDoubleArray = ^TDoubleArray;

  TIntArray = array[0..1000] of Integer;
  PIntArray = ^TIntArray;
  ...
  ... <other unrelated code>

  var      
    Indicies:TIntArray;
    PIndicies:PIntArray;
    Dists:TDoubleArray;
    PDists:PDoubleArray;
    ...
  begin
    ...
    PIndicies:=@Indicies;
    PDists   :=@Dists; 

   radius_s:=flann_radius_search_double(idx ,&PMyArray^[0,0],Pindicies^[0],&PDists^[0],1000,10,&DEFAULT_FLANN_PARAMETERS);
类型
TDoubleArray=双精度阵列[0..1000];
PDoubleArray=^TDoubleArray;
TIntArray=整数的数组[0..1000];
PIntArray=^1数组;
...
... 
变量
标记:着色阵列;
松果类:松果;
地区:t杜布雷雷;
PDists:PDoubleArray;
...
开始
...
小品红:=@标记;
PDists:=@Dists;
半径:法兰半径搜索双精度(idx、PMyArray^[0,0]、PINDICES^[0]、PDIST^[0]、1000,10和默认法兰参数);
它不起作用了,看起来很不对劲:* 我真的非常感谢你的帮助

编辑:我修复了双重/单一错误,但当我尝试使用@Indicies[0]而不是Indicies[0]时,我得到一个错误:

错误:var对参数3的调用必须完全匹配:Get“Pointer” 预期的“渴望”


免责声明:以下内容是指问题完全更改之前的原始版本。在原始版本中,浮点参数都是浮点。我敦促Mike使用复制/粘贴发布真实代码,以避免浪费人们的时间

C float相当于Delphi Single,即4字节浮点类型。这是您遇到的主要问题

我个人会在导入声明中将数组声明为PSingle或PInteger,而不是使用var参数

调用函数时,我不会使用固定维度的数组。我会使用动态数组和SetLength。然后使用PSingle(MyArray)或@MyArray[0]传递数组,以您喜欢的为准

我更喜欢整数而不是Longint,因为我认为整数最接近于C int

数组的大小为1001个元素,只需1000个即可

结构最好按照导入声明中的方式通过var传递,而不是调用中的方式

function flann_radius_search_double(
  index_ptr: flann_index_t;
  var query: Single;
  indices: PInteger;
  dists: PSingle;
  max_nn: Integer;
  radius: Single;
  var flann_params: FLANNParameters
): Integer; cdecl; external External_library Name 'flann_radius_search_double';   
...
var
  indices: array of Integer;
  dists: array of Single;
...
SetLength(indices, 1000);
SetLength(dists, 1000);    
radius_s := flann_radius_search_double(
  idx,
  MyArray[0,0],
  @indicies[0],
  @dists[0],
  1000,
  10.0,
  DEFAULT_FLANN_PARAMETERS
);

免责声明:以下内容是指问题完全更改之前的原始版本。在原始版本中,浮点参数都是浮点。我敦促Mike使用复制/粘贴发布真实代码,以避免浪费人们的时间

C float相当于Delphi Single,即4字节浮点类型。这是您遇到的主要问题

我个人会在导入声明中将数组声明为PSingle或PInteger,而不是使用var参数

调用函数时,我不会使用固定维度的数组。我会使用动态数组和SetLength。然后使用PSingle(MyArray)或@MyArray[0]传递数组,以您喜欢的为准

我更喜欢整数而不是Longint,因为我认为整数最接近于C int

数组的大小为1001个元素,只需1000个即可

结构最好按照导入声明中的方式通过var传递,而不是调用中的方式

function flann_radius_search_double(
  index_ptr: flann_index_t;
  var query: Single;
  indices: PInteger;
  dists: PSingle;
  max_nn: Integer;
  radius: Single;
  var flann_params: FLANNParameters
): Integer; cdecl; external External_library Name 'flann_radius_search_double';   
...
var
  indices: array of Integer;
  dists: array of Single;
...
SetLength(indices, 1000);
SetLength(dists, 1000);    
radius_s := flann_radius_search_double(
  idx,
  MyArray[0,0],
  @indicies[0],
  @dists[0],
  1000,
  10.0,
  DEFAULT_FLANN_PARAMETERS
);

在Delphi中,
float
映射到
Single
而不是
Double
。因此它变成:

function flann_radius_search_double(index_ptr: flann_index_t; 
                                    var query: Single;
                                    indices: PInteger; // array, so NOT a var parameter
                                    dists: PSingle;    // array, so NOT a var parameter 
                                    max_nn: Integer;
                                    radius: Single;
                                    var flann_params: FLANNParameters): Integer; 
   cdecl; etc...
你这样称呼它:

 const
   CArraySize = 1000;

 ...

 var
   Indices: array[0..CArraySize - 1] of Integer;
   Dists: array[0..CArraySize - 1] of Single;
 begin
   ...
   x := flann_radius_search_double(idx, yourQuery, 
          @Indices[0], @Dists[0], Length(Dists), yourRadius, yourFlannParams);

在Delphi中,
float
映射到
Single
而不是
Double
。因此它变成:

function flann_radius_search_double(index_ptr: flann_index_t; 
                                    var query: Single;
                                    indices: PInteger; // array, so NOT a var parameter
                                    dists: PSingle;    // array, so NOT a var parameter 
                                    max_nn: Integer;
                                    radius: Single;
                                    var flann_params: FLANNParameters): Integer; 
   cdecl; etc...
你这样称呼它:

 const
   CArraySize = 1000;

 ...

 var
   Indices: array[0..CArraySize - 1] of Integer;
   Dists: array[0..CArraySize - 1] of Single;
 begin
   ...
   x := flann_radius_search_double(idx, yourQuery, 
          @Indices[0], @Dists[0], Length(Dists), yourRadius, yourFlannParams);

这里有回音!!;-)嗯,他的代码的问题对每个人都是一样的他引用数组的方式非常混乱,所以我决定演示如何正确地使用它。一段源代码可以说超过1000个单词嗯,我不能让@Indicies[0]或@Dists[0]这样工作。。。我得到一个错误:错误:var对arg no.3的调用必须完全匹配:得到“指针”预期为“LongInt”@rudy另一方面,没有解释的源代码除了如何复制之外,什么都不会教。最好是将这两个答案合并。@Mike:你是否也应用了其他更改?我想你没有。我的翻译使用指针,而不是var参数。当您想要传递数组时,Var参数是错误的(请参阅我的转换文章)。如果你使用我的翻译,那么你可以像我一样传递数组。这里有回声!!;-)嗯,他的代码的问题对每个人都是一样的他引用数组的方式非常混乱,所以我决定演示如何正确地使用它。一段源代码可以说超过1000个单词嗯,我不能让@Indicies[0]或@Dists[0]这样工作。。。我得到一个错误:错误:var对arg no.3的调用必须完全匹配:得到“指针”预期为“LongInt”@rudy另一方面,没有解释的源代码除了如何复制之外,什么都不会教。最好是将这两个答案合并。@Mike:你是否也应用了其他更改?我想你没有。我的翻译使用指针,而不是var参数。当您想要传递数组时,Var参数是错误的(请参阅我的转换文章)。如果您使用我的翻译,那么您可以像我一样传递数组。您还必须更改导入声明!从var Index:Integer更改为Index:Pinteger,就像我说的和Rudy演示的那样。您还必须更改导入声明!从var Index:Integer更改为Index:Pinteger,就像我说的和Rudy演示的那样。您还必须更改导入声明!从var Index:Integer更改为Index:Pinteger,就像我说的和Rudy演示的那样。您还必须更改导入声明!改变f