2015-02-04 148 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); 
相關問題