2016-07-19 11 views
0

コンパイルするとき、私は次のエラーを取得する:ここでは、コードIST 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の{別名長いunsigned int型} [size_tの{別名長いunsigned int型}]' 配列の添字用

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 > interactMatrix(num_independent_variables、std :: vector (num_independent_variables));' – PaulMcKenzie

+0

'computeInteractionScore()'の中では、 'interactionMatrix'を1次元として扱うことができますアレイ。ですから、i行目とk列目の要素に 'interactMatrix [i * num_independent_variables + k]'としてアクセスする必要があります。 – Leon

+0

私はより良いdupがこれだと思います:http://stackoverflow.com/questions/14548753/passing-a-multidimensional-variable-length-array-to-a-function、それはVLA-sにもっと関連しているので。このコードのもう1つの問題は、OPがこの配列へのポインタを渡していることです。 – marcinj

答えて

0

まず問題は、次のとおりです。

size_t interactionMatrix[num_independent_variables][num_independent_variables]; 

は、size_tがconstではないため、デフォルトではg ++で有効になっている非標準の拡張であるため、VLA(Variable Length Array)です。私が覚えている限り、スタックにもメモリが割り当てられているので、配列が大きすぎるとスタックオーバーフローが発生する可能性があります。動的に割り当てられた配列(またはより良いベクトルのベクトル)に変更することをお勧めします。例えば

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

それは正しくありません。彼はポインタの配列ではなく、2次元の配列を渡しています。 – Barmar

関連する問題