2013-03-24 28 views
1

我正在爲我的課寫一個回溯問題,我必須實現一些現有的功能。這是我必須實現的功能之一。 void *input是我們應該傳遞數據的地方,在我的情況下這是一個二維向量。爲什麼這不訪問矢量位置?

void process_solution(int a[], int k, void *input, bool *finished) 
{ 
    int sumweight = 0; 
    int sumvalue = 0; 
    std::vector<std::vector<int> > *datavector = static_cast<std::vector<std::vector<int> >* >(input); 
    for(unsigned i=0; i<sizeof(a); i++) 
    { 
     sumweight += a[i]*datavector[i][0]; 
     sumvalue += a[i]*datavector[i][1]; 
    } 
} 

不過,我相信的東西是錯誤與我的演員,因爲我在該行得到一個錯誤sumweight += a[i]*datavector[i][0];

error: no match for 'operator*' in '*(a + ((long long unsigned int)(((long long unsigned int)i) * 4ull))) * (datavector + ((long long unsigned int)(((long long unsigned int)i) * 24ull)))->std::vector<_Tp, _Alloc>::operator[] with _Tp = std::vector, _Alloc = std::allocator >, std::vector<_Tp, _Alloc>::reference = std::vector&, std::vector<_Tp, _Alloc>::size_type = long long unsigned int'

如果我嘗試使用另一個變量來訪問向量,像int t1 = datavector[i][0];,我得到一個錯誤

error: cannot convert 'std::vector' to 'int' in initialization

我想到了一個空指針可以用來傳遞任何東西,只要適當的鑄製成。這裏發生了什麼?

+0

這裏唯一有效傳入'void *'的東西是'std :: vector *'。當你可以使用模板時不要使用'void *'! – Pubby 2013-03-24 23:38:51

+0

它是一個向量矢量的*指針*。在開始鑽入'operator []'之前,您需要取消引用指針。即'(* datavector)[i] [0]' – WhozCraig 2013-03-24 23:39:42

+0

還要注意'sizeof(a)'等價於sizeof(int *)'。我懷疑這不是你打算在這裏做的。 – 2013-03-24 23:40:55

回答

4

datavector變量是一個指針int載體的載體,所以你應該申請適當的非關聯化:

sumweight += a[i] * (*datavector)[i][0]; 
//     ^^^^^^^^^^^^^ 

sumvalue += a[i] * (*datavector)[i][1]; 
//     ^^^^^^^^^^^^^ 

而且,這樣的:

for (unsigned i=0; i < sizeof(a); i++) 
//      ^^^^^^^^^ 

威爾計數數組中元素的數量(這使我認爲你沒有使用的參數k是平均值t來包含該數組的長度)。

+0

沒關係,我在錯誤的地方有括號。現在這部分工作,謝謝。我沒有使用k作爲數組的大小,因爲它被指定爲別的東西。那麼我該怎麼做呢? – iamthesgt 2013-03-25 00:06:21

+0

@iamthesgt:或者傳遞一個指定數組中元素個數的參數,或者使用'std :: vector'而不是數組(然後,可以通過'size()'成員函數查詢它的大小) 。 – 2013-03-25 00:08:44

+0

其實,我想出瞭如何去做。在某些情況下,k只是數組的大小*,但是這種特殊的函數只能在這些情況下運行*。我可以通過'(* datavector)'的大小來找到數組的大小。感謝你的幫助! – iamthesgt 2013-03-25 00:24:50

1

首先,你的循環是錯誤的:

for(unsigned i=0; i<sizeof(a); i++) 

sizeof(a)永遠是sizeof(int*),因爲你無法通過陣列功能,不管你的簽名。該參數將是一個指針,所以你永遠不會正確訪問你的向量。你的下一個問題是你有一個指向矢量的指針(通常是壞主意),但是你沒有正確地解引用它。在索引到下一個矢量(然後到下一個矢量中)之前,需要一個解引用。 ),即,

sumweight += a[i] * (*datavector)[i][0]; 

接下來,問問自己;你爲什麼要處理指向向量的向量的指針?這是一個非常草率和容易出錯的解決方案。

+0

我不喜歡這樣做,但函數聲明已經存在,這是我看到的最好的方式。 – iamthesgt 2013-03-25 00:09:40

+0

@iamthesgt:是的,確切的。數組不能傳遞給函數或從函數返回;他們總是會降低成第一個元素的指針。如果你想傳遞一個數組,那麼你將不得不通過大小。更好的是;使用'std :: array'(並傳遞對它的引用)並停止使用指針向量(指針...)。它使事情複雜化,更好地傳遞向量的引用,或者,如果你必須傳遞一個'void *'(你呢?這在C++中通常是罕見的用例,保留用於像C風格的回調之類的東西。 )然後傳遞一個包含向量的對象 – 2013-03-25 00:14:28

+0

不,這是用於賦值的,我必須使用函數聲明(它指定'void *')。我會考慮改變它。謝謝你的幫助!如果可以的話,我會贊成,但我沒有代表 – iamthesgt 2013-03-25 00:26:49