TDataset - >指向行cols矩阵的指针?

时间:2011-08-20 14:14:32

标签: c delphi pointers matrix tdataset

我正在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对象吗?我是否必须先做一些事情才能使指针处于正确的形式?

3 个答案:

答案 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; 

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