函数中无效常量 * 参数的目的

Purpose of void const * argument in function

本文关键字:参数 常量 无效 函数      更新时间:2023-10-16

我正在尝试使用 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 循环填充矩阵)

谢谢!

const ,尽管标准化委员会尽了最大努力来混淆您,但并不意味着"恒定"。它的意思是"只读"。

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

因此,只需以常规方式构建矩阵(非const,因为您需要使用循环完成它),并将其传入,确信它将返回不变。

除非。。。函数的代码丢弃了常量。这应该让写它的人立即被解雇。

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

(允许添加 const:一个函数可能总是承诺不修改对象,即使它可以被修改。不允许删除 const:如果原始函数在承诺不会修改对象的情况下被赋予了对象,则函数不得修改对象,或将其提供给另一个需要可修改对象的函数。

void ,当用作指针的类型时,表示"任何内容"。 也就是说,您可以将 int 指针转换为 void 指针,将双指针转换为 void-pointer - 任何你喜欢的指针都指向 void-pointer。这样做的原因是,大多数时候,采用 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);