2015-02-04 87 views
1

我试图使用VLFeat中的库函数来调用数据,使其成为一个const void *。我真的不知道如何创建的数据,然后通过它在函数中void const *参数的用途

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 *类型在参数中的用途。

任何帮助将不胜感激。

注:我不明白是什么意思常量,但是,例如,我想不通我怎么能重复建设常量数据(即填充基质具有双重的for循环)

谢谢!

+0

_数据存储确实“我怎么能重复建设常量数据” _并不需要'在第一名const'。函数参数中的'const'属性意味着该函数不会改变它。 –

+0

@KeithThompson我改了它 – marcman

+0

它只是确保谁试图使用那个函数“我,这个函数不会尝试写入该指针”。 – user3528438

回答

7

const尽管标准委员会尽最大的努力来混淆你,但并不意味着“不变”。它的意思是“只读”。

通过声明其参数为pointer-const,该函数声明您的数据不会被复制,但函数的代码只能读取它,而不能修改它。

所以只是建立你的矩阵正规途径(非const,因为需要与循环完成它),并通过它,相信它会返回不变。

除非...该功能的代码转换掉了const。应该让写这封信的人立即开除。

+0

'const_cast' - 我们存在的祸根。 –

+2

@BillyONeal你用泪uns weapon的武器,知道它不应该走那条路。 – Quentin

+1

@Billy C风格和函数风格转换更糟,因为他们可以虚拟*任何*转换*任何*。至少'const_cast'可以通过grep找到。尝试grep一个C风格演员:( –

2

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); 
相关问题