C ++:错误:无效类型'size_t {aka long unsigned int} [size_t {aka long unsigned int}]'for array下标

时间:2016-07-19 10:07:25

标签: c++ arrays

编译时出现以下错误: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);
  }

1 个答案:

答案 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));

并相应更改功能签名。