c - TDataset --> 指向行列矩阵的指针?

标签 c delphi pointers matrix tdataset

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

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

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

This function builds an index and return a reference to it. The arguments expected by this function are as follows: dataset, rows and cols - are used to specify the input dataset of points: dataset is a pointer to a rows cols matrix stored in row-major order (one feature on each row)

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

最佳答案

显然你不能传递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;     

无耻插件

请阅读我的Pitfalls of Conversion关于将函数声明从 C 转换为 Delphi(可能还有 Win32 上的 FreePascal)的文章。现在我开始了,你可能想阅读我的文章 Addressing Pointers也是。

关于c - TDataset --> 指向行列矩阵的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7132285/

相关文章:

c - GTK+ 用户界面测试

c - G-wan C Sha1 散列

multithreading - 释放线程时发生死锁

delphi - 当 View 是非模态时,如何在 View 之前销毁适配器?

c++ ifstream读取无法存储到短数组缓冲区中

c++ - 字符指针(由 new 分配)及其初始化

c# - 在 C# 中使用 C++ DLL

delphi - 将pe文件从内存转储到磁盘

Delphi 内存泄漏,指向 TStringList 的指针

c : matrix multiplication without * operator