C++:错误:数组下标的类型“size_t{aka long unsigned int}[size_t{aka long

C++: error: invalid types ‘size_t {aka long unsigned int}[size_t {aka long unsigned int}]’ for array subscript

本文关键字:aka long size unsigned int 错误 数组 C++ 下标 类型      更新时间:2023-10-16

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

第一个问题是:

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];

那么您当前的函数参数类型将需要更改为CCD_ 3。但是,您需要编写自己的释放代码,并且为了安全起见,将std::unique_ptr与数组的自定义deleter一起使用。

最好切换到:

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

并相应地改变功能签名。

相关文章: