函数中void const *参数的用途

时间:2015-02-04 21:01:10

标签: c++ vlfeat

我正在尝试使用VLFeat中的库函数来调用数据为const void *。我真的不明白如何创建数据然后将其传入。

This is the function call

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,但我无法弄清楚如何使用这些数据。换句话说,这个函数需要这个参数。但是为了使它有用,我必须了解如何投射/创建/加载数据以使其工作。这意味着,我需要理解参数中const void *类型的目的。

任何帮助都将受到高度赞赏。

注意:我确实理解const意味着什么,但是,例如,我无法弄清楚如何迭代地构建const数据(即用双for循环填充矩阵)

谢谢!

2 个答案:

答案 0 :(得分:7)

const,尽管标准化委员会尽最大努力使你迷惑,但并不意味着“不变”。这意味着“只读”。

通过将其参数声明为指向const的指针,此函数指出您的数据不会被复制,但函数的代码只能读取它,而不能修改它

所以,只需按常规方式构建矩阵(非const,因为需要用循环完成它),然后将其传入,相信它会保持不变。< / p>

除非......函数的代码抛弃了const 。哪个应该让那个写它的人立即解雇。

答案 1 :(得分:2)

const仅表示不允许vl_kmeans_init_centers_with_rand_data修改该数据。即不必使用const数组,您可以传递“正常”(可变)数组。 const总是可以通过隐式转换添加 - 只是不是相反。

(允许添加const:一个函数可能总是保证不会修改一个对象,即使它可以被修改。不允许删除const:一个函数可能不会修改一个对象,或者把它交给另一个需要修改的函数object,如果原始函数已被赋予对象,则它将不会修改对象。)

void用作指针的类型时,意味着“任何东西”。即你可以将一个int指针转换为一个void指针,一个指向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);