2

データが const void * であることを要求する VLFeat のライブラリ関数を使用しようとしています。データを作成して渡す方法がよくわかりません。

これは関数呼び出しです:

void vl_kmeans_init_centers_with_rand_data  (VlKMeans * self, void const * data,
    vl_size dimension, vl_size numData, vl_size numCenters)

データ引数は私をスローするものです。kmeans クラスタリング関数をテストするためにランダム データ マトリックスを構築しようとしましたが、データの使用方法がわかりません。つまり、この関数にはこの引数が必要です。しかし、それが役立つためには、データをキャスト/作成/ロードして機能させる方法を理解する必要があります。つまりconst void *、引数の型の目的を理解する必要があります。

どんな助けでも大歓迎です。

注: const の意味は理解できますが、たとえば、const データを反復的に構築する方法がわかりません (つまり、行列を二重の for ループで埋めます)。

ありがとう!

4

2 に答える 2

11

const、標準化委員会があなたを混乱させるための最善の努力にもかかわらず、「一定」を意味するものではありません。「読み取り専用」という意味です。

この関数は、そのパラメーターを pointer-to- として宣言することによりconst、データが途中でコピーされないことを示しますが、関数のコードはそれを読み取ることしかできず、変更することはできません。

したがって、通常の方法で行列を作成し (ループで完了するconst必要があるため)、それを渡して、変更されずに返されることを確信してください。

ない限り...関数のコードが const をキャストします。それを書いた男をすぐにクビにするべきだ。

于 2015-02-04T21:08:36.217 に答える
2

は、そのデータの変更が許可されていないことをconst意味します。vl_kmeans_init_centers_with_rand_dataつまり、配列を使用する必要はありませんconst。「通常の」(変更可能な) 配列を渡すことができます。const暗黙的な変換によって常に追加できますが、その逆はできません。

(const の追加を許可: 関数は、オブジェクトが変更される可能性がある場合でも、オブジェクトを変更しないことを常に約束する場合があります。 const の削除は許可されません: 関数は、オブジェクトを変更することはできません。元の関数には、オブジェクトを変更しないという約束の下でオブジェクトが与えられています。)

void、ポインターの型として使用される場合、「何でも」を意味します。つまり、int ポインターを void ポインターに変換したり、double ポインターを void ポインターに変換したり、任意のポインターを void ポインターに変換したりできます。その理由は、ほとんどの場合、void ポインター引数を取る関数がさまざまなデータ型を処理できるためです。この場合、関数が引数を解釈する方法をおそらく制御するVlKMeansメンバーがあります。dataTypevl_kmeans_init_centers_with_rand_datadata

dataTypeegが に設定されていると仮定するとVL_TYPE_DOUBLE、これは機能するはずです。

std::vector<double> data(numData);
// fill 'data' with data
vl_kmeans_init_centers_with_rand_data(vlkMeans, &data[0], dimension, numData, numCenters);
于 2015-02-04T21:22:43.183 に答える