我正在Lazarus / FreePascal(像Delphi)中编写一个Windows应用程序。我有一个TDataset对象,其中包含 5000行,2列的数值。
我需要将此数据传递给我从.dll库静态导入的C
函数。
以下是图书馆手册的摘录,说明了其参数应采用的格式:
flan_index_t flann_build_index(float* dataset,
int rows,
int cols,
float* speedup,
struct FLANNParameters* flann_params);
此函数构建索引并返回对它的引用。该 此函数预期的参数如下:dataset,rows和 cols - 用于指定点的输入数据集: 数据集是指向存储在row-major中的行cols矩阵的指针 订单(每行一个功能)
我可以简单地传递TDataSet对象吗?我是否必须先做一些事情才能使指针处于正确的形式?
答案 0 :(得分:1)
不,您无法直接传递数据集。命名“数据集”可能意味着,但意义完全不同。您必须将指针传递给函数的浮点矩阵。要实现这一点,你应该声明一个浮点数组[0..4999,0..1](可能是double)并从数据集中填充它。
答案 1 :(得分:1)
显然你无法传递TDataSet
对象。它是一个FreePascal对象,该函数似乎期望指向float
(可能是FreePascal中Single
的指针)。它可能需要一个float
的二维数组。你必须传递另一个指向float
的指针和一个指向FLANNParameters
结构的指针。
Move()
也不起作用。 TDataSet
不是数组。
我想你必须声明一个像Uwe所说的数组,用你的数据集填充它并传递数组:
type
PMyFloatArray = ^TFloatArray;
TMyFloatArray = array[0..4999, 0..1] of Single;
var
MyArray: PMyFloatArray;
idx: flan_index_t;
begin
New(MyArray);
try
// Fill array using your TDataSet...
// set up other parameters...
idx := flann_build_index(MyArray, 5000, 2, &speedup, etc...);
// ...
finally
Dispose(MyArray);
end;
end;
请阅读我关于将函数声明从C转换为Delphi(以及Win32上的FreePascal)的Pitfalls of Conversion文章。现在我就是这样,你也可以阅读我的文章Addressing Pointers。
答案 2 :(得分:0)
以Rudy的解决方案为基础(顺便说一句!)我想出了这个:
with Datasource1.DataSet do
begin
Open;
First;
field_count := FieldCount;
record_count := RecordCount;
row := 0;
while not EOF do
begin
for col := 0 to field_count - 1 do
MyArray[row, col] := Fields.Fields[col].AsFloat;
row := row + 1; //Shift to next row in array
Next; //Shift to next row in dataset
end;
end;
似乎工作得很好;并且比我预期的要快很多。