编译时出现以下错误:error: invalid types ‘size_t {aka long unsigned int}[size_t {aka long unsigned int}]’ for array subscript interactionMatrix[i][k]=interaction;
这是代码:
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 :(得分:1)
第一个问题是:
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));
并相应更改功能签名。