函数中 void const * 参数的用途
Purpose of void const * argument in function
我正在尝试使用 VLFeat 中的库函数,该函数要求数据为 const void *。我不太明白如何创建数据然后将其传递进来。
void vl_kmeans_init_centers_with_rand_data (VlKMeans * self, void const * data,
vl_size dimension, vl_size numData, vl_size numCenters)
数据参数让我很生气。我尝试构建一个随机数据矩阵来测试 kmeans clustering function,但我不知道如何使用这些数据。换句话说,这个函数需要这个参数。但要使其有用,我必须了解如何 cast/create/load 数据使其发挥作用。这意味着,我需要了解参数中 const void *
类型的用途。
非常感谢任何帮助。
注意:我确实理解 const 的含义,但是,例如,我不知道如何迭代构建 const 数据(即用双 for 循环填充矩阵)
谢谢!
const
,尽管标准化委员会尽最大努力让您感到困惑,但这并不意味着 "constant"。意思是"read-only".
通过将其参数声明为指向 const
的指针,此函数声明您的数据不会在其传入的过程中被复制,但函数的代码将只能读取它,而不能修改一下。
所以只需以常规方式构建矩阵(非const
,因为你需要用循环来完成它),然后将其传入,确信它将return不变。
除非...函数的代码抛弃了const。这应该让编写它的人立即被解雇。
const
仅表示 vl_kmeans_init_centers_with_rand_data
不允许修改该数据。 IE。 你不必使用const
数组,你可以传递一个"normal"(可变)数组。 const
始终可以通过隐式转换添加 - 而不是相反。
(允许添加const:一个函数可能总是承诺不修改一个对象,即使它可以被修改。不允许删除const:一个函数不能修改一个对象,或者把它交给另一个期望的函数一个可修改的对象,如果原始函数已在承诺不会修改该对象的情况下被赋予该对象。)
void
用作指针类型时,表示 "anything"。 IE。您可以将 int 指针转换为 void 指针,将 double 指针转换为 void 指针 - 任何您喜欢的指针都可以转换为 void 指针。大多数情况下,这样做的原因是采用 void-pointer 参数的函数可以处理不同的数据类型。在这种情况下,VlKMeans
有一个成员 dataType
,它可能控制 vl_kmeans_init_centers_with_rand_data
函数将如何解释 data
参数。
假设例如dataType
设置为 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);
我正在尝试使用 VLFeat 中的库函数,该函数要求数据为 const void *。我不太明白如何创建数据然后将其传递进来。
void vl_kmeans_init_centers_with_rand_data (VlKMeans * self, void const * data,
vl_size dimension, vl_size numData, vl_size numCenters)
数据参数让我很生气。我尝试构建一个随机数据矩阵来测试 kmeans clustering function,但我不知道如何使用这些数据。换句话说,这个函数需要这个参数。但要使其有用,我必须了解如何 cast/create/load 数据使其发挥作用。这意味着,我需要了解参数中 const void *
类型的用途。
非常感谢任何帮助。
注意:我确实理解 const 的含义,但是,例如,我不知道如何迭代构建 const 数据(即用双 for 循环填充矩阵)
谢谢!
const
,尽管标准化委员会尽最大努力让您感到困惑,但这并不意味着 "constant"。意思是"read-only".
通过将其参数声明为指向 const
的指针,此函数声明您的数据不会在其传入的过程中被复制,但函数的代码将只能读取它,而不能修改一下。
所以只需以常规方式构建矩阵(非const
,因为你需要用循环来完成它),然后将其传入,确信它将return不变。
除非...函数的代码抛弃了const。这应该让编写它的人立即被解雇。
const
仅表示 vl_kmeans_init_centers_with_rand_data
不允许修改该数据。 IE。 你不必使用const
数组,你可以传递一个"normal"(可变)数组。 const
始终可以通过隐式转换添加 - 而不是相反。
(允许添加const:一个函数可能总是承诺不修改一个对象,即使它可以被修改。不允许删除const:一个函数不能修改一个对象,或者把它交给另一个期望的函数一个可修改的对象,如果原始函数已在承诺不会修改该对象的情况下被赋予该对象。)
void
用作指针类型时,表示 "anything"。 IE。您可以将 int 指针转换为 void 指针,将 double 指针转换为 void 指针 - 任何您喜欢的指针都可以转换为 void 指针。大多数情况下,这样做的原因是采用 void-pointer 参数的函数可以处理不同的数据类型。在这种情况下,VlKMeans
有一个成员 dataType
,它可能控制 vl_kmeans_init_centers_with_rand_data
函数将如何解释 data
参数。
假设例如dataType
设置为 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);