2016-07-19 77 views
0

編譯時我得到以下錯誤:error: invalid types ‘size_t {aka long unsigned int}[size_t {aka long unsigned int}]’ for array subscript interactionMatrix[i][k]=interaction;C++:錯誤:無效類型 '爲size_t {又名長無符號整型} [爲size_t {又名長無符號整型}]' 的數組下標

這裏IST的代碼:

void Tree::computeInteractionScore(size_t* interactionMatrix){ 
    size_t num_independent_variables = data->getNumCols() - no_split_variables->size(); 

    for (size_t i = 0; i < num_independent_variables; ++i) { 
    for (size_t k = 0; i < num_independent_variables; ++k) { 
     size_t interaction = 0; 
     if(k!=i){ 
     // interaction = computeInteraction(i,k); 
     } 
     interactionMatrix[i][k]=interaction; 
    } 
    } 
} 

interactionMatrix聲明如下:

size_t num_independent_variables = data->getNumCols() - no_split_variables->size(); 

    size_t interactionMatrix[num_independent_variables][num_independent_variables]; 

    for (size_t i = 0; i < num_trees; ++i) { 
    trees[i]->computeInteractionScore(&interactionMatrix); 
    } 
+0

'size_t interactionMatrix [num_independent_variables] [num_independent_variables];' - 這是無效的C++。數組必須使用編譯時表達式聲明來表示條目數。你可以使用'std :: vector > interactionMatrix(num_independent_variables,std :: vector (num_independent_variables));' – PaulMcKenzie

+0

'computeInteractionScore()'內部''你可以使用'interactionMatrix'作爲一維陣列。因此,您必須以'interactionMatrix [i * num_independent_variables + k]'的形式訪問'第i行和第k列的元素。 – Leon

+0

我認爲更好的重複是這一個:http://stackoverflow.com/questions/14548753/passing-a-multidimensional-variable-length-array-to-a-function,因爲它更多與VLA-s有關。此代碼的另一個問題是OP正在將指針傳遞給此數組。 – marcinj

回答

0

第一個問題是:

size_t interactionMatrix[num_independent_variables][num_independent_variables]; 

是VLA(可變長度數組),因爲size_t是非常量,所以它是非標準擴展,默認情況下在g ++下啓用。據我所知,它也在堆棧中分配內存,所以如果陣列太大,最終可能會導致堆棧溢出。我建議你將它改爲動態分配的數組(或更好的矢量向量)。例如

size_t **interactionMatrix; 
interactionMatrix = new int*[num_independent_variables]; 

for (int i = 0; i < num_independent_variables; i++) 
    interactionMatrix[i] = new int[num_independent_variables]; 

那麼當前的函數參數類型將需要改變size_t**。但是,您需要編寫自己的釋放代碼,並且可以安全地使用std :: unique_ptr和數組的自定義刪除器。

更好的是,切換到:

std::vector<std::vector<size_t>> interactionMatrix(num_independent_variables, std::vector<size_t>(num_independent_variables)); 

,並相應地改變函數簽名。

+0

這是不對的。他傳遞了一個二維數組,而不是一個指針數組。 – Barmar

相關問題