0

我正在用 Lazarus/FreePascal(如 Delphi)编写一个 Windows 应用程序。我有一个由5000 行、2 列数值填充的TDataset对象。我需要将此数据传递给我从 .dll 库中静态导入的函数。C

这是该库手册的摘录,解释了其参数应采用的格式:

flan_index_t flann_build_index(float* dataset,
    int rows,
    int cols,
    float* speedup,
    struct FLANNParameters* flann_params);

这个函数建立一个索引并返回一个对它的引用。此函数预期的参数如下: dataset、rows 和 cols - 用于指定点的输入数据集: dataset 是指向以行优先顺序存储的 rows cols 矩阵的指针(每行一个特征)

我可以简单地传递 TDataSet 对象吗?我是否必须先对其进行处理以使指针处于正确的形式?

4

3 回答 3

1

不,您不能直接传递数据集。命名“数据集”可能暗示这一点,但含义完全不同。您必须将指向浮点矩阵的指针传递给函数。要实现这一点,您应该声明一个浮点数组[0..4999, 0..1](可能是双精度)并从数据集中填充它。

于 2011-08-20T14:50:41.570 回答
1

显然你不能传递TDataSet对象。它是一个 FreePascal 对象,并且该函数似乎需要一个指向 a 的指针float(这可能是指向SingleFreePascal 中的 a 的指针)。float它可能需要一个's的二维数组。您还必须传递另一个指向结构float的指针和一个指向FLANNParameters结构的指针。

Move()也不会工作。ATDataSet不是数组。

我想你必须像 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)的转换陷阱文章。现在我已经完成了,您可能也想阅读我的文章寻址指针

于 2011-08-20T14:52:26.760 回答
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; 

似乎工作得很好;而且比我预期的要快得多。

于 2011-08-21T01:10:57.323 回答