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 は、行優先順 (各行に 1 つのフィーチャ) で格納された行 cols マトリックスへのポインターです。

TDataSet オブジェクトを単純に渡すことはできますか? ポインターが正しい形式になるように、最初に何かをする必要がありますか?

4

3 に答える 3

1

いいえ、データセットを直接渡すことはできません。「データセット」という名前はそれを意味するかもしれませんが、意味はまったく異なります。関数へのfloat行列へのポインターを渡す必要があります。これを実装するには、float(おそらくdouble)のarray [0..4999、0..1]を宣言し、データセットから入力する必要があります。

于 2011-08-20T14:50:41.570 に答える
1

TDataSet明らかに、オブジェクトを渡すことはできません。これはFreePascalオブジェクトであり、関数はaへのポインターfloat(おそらくSingleFreePascalのaへのポインター)を予期しているようです。おそらく、の2次元配列を想定していfloatます。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

ルディのソリューションをベースとして使用して(ちなみにありがとう!)私はこれを思いつきました:

 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 に答える