需要帮助从Delphi正确调用C函数吗
我正在Delphi中静态导入一个动态库(DLL),并尝试访问它的函数 下面是我试图访问的特定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
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