Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数中void const*参数的用途_C++_Vlfeat - Fatal编程技术网

C++ 函数中void const*参数的用途

C++ 函数中void const*参数的用途,c++,vlfeat,C++,Vlfeat,我试图使用VLFeat中的一个库函数,该函数调用数据为const void*。我真的不明白如何创建数据,然后将其传入 : data参数是让我感到困惑的参数。我尝试构建一个随机数据矩阵来测试数据,但我不知道如何使用数据。换句话说,这个函数需要这个参数。但是为了使它有用,我必须了解如何转换/创建/加载数据以使其工作。这意味着,我需要理解参数中const void*类型的用途 任何帮助都将不胜感激 注意:我确实理解const的含义,但是,例如,我不知道如何迭代构建const数据(即用dual for循

我试图使用VLFeat中的一个库函数,该函数调用数据为const void*。我真的不明白如何创建数据,然后将其传入

:

data参数是让我感到困惑的参数。我尝试构建一个随机数据矩阵来测试数据,但我不知道如何使用数据。换句话说,这个函数需要这个参数。但是为了使它有用,我必须了解如何转换/创建/加载数据以使其工作。这意味着,我需要理解参数中
const void*
类型的用途

任何帮助都将不胜感激

注意:我确实理解const的含义,但是,例如,我不知道如何迭代构建const数据(即用dual for循环填充矩阵)


谢谢

const
,尽管标准化委员会尽了最大努力让您感到困惑,但这并不意味着“恒定”。它的意思是“只读”

通过将其参数声明为指向-
const
的指针,此函数表示数据在传入时不会被复制,但函数的代码只能读取数据,不能修改数据

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


除非。。。函数的代码丢弃常量。这应该会让写它的人很快被解雇。

const只意味着
vl\u kmeans\u init\u centers\u与\u rand\u data
不允许修改该数据。也就是说,您不必使用
const
数组,您可以传递一个“正常”(可变)数组
const
始终可以通过隐式转换进行添加,而不是相反

(允许添加常量:函数可能始终承诺不修改对象,即使对象可以修改。不允许删除常量:如果原始函数在承诺不修改对象的情况下被赋予对象,则函数可能不会修改对象,或将对象交给另一个期望可修改对象的函数。)

当用作指针的类型时,
void
,表示“任何”。也就是说,您可以将int指针转换为void指针,将双指针转换为void指针-任何您喜欢的指向void指针的指针。原因是,大多数情况下,采用void指针参数的函数可以处理不同的数据类型。在这种情况下,
VlKMeans
有一个成员
dataType
,它可能控制
VlKMeans\u init\u如何使用_rand\u 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);
std::矢量数据(numData);
//用数据填充“数据”
vl_kmeans_init_centers_与随机数据(vlkMeans和数据[0],维度,numData,numCenters);

“如何迭代构建常量数据”数据存储不需要排在第一位。函数参数处的
const
属性仅表示该函数不会更改它。@KeithThompson我切换了它,它只是确保尝试使用该函数的人“我,这个函数,不会尝试写入该指针”.
const_cast
——我们存在的祸根。@BillyONeal是你用眼泪拔出的武器,知道它不应该那样做。@Billy C风格和函数风格的类型更糟糕,因为它们几乎可以对任何东西施放任何东西。至少可以通过grep找到
const_cast
。尝试grep C风格的演员阵容:(
std::vector<double> data(numData);
// fill 'data' with data
vl_kmeans_init_centers_with_rand_data(vlkMeans, &data[0], dimension, numData, numCenters);