RCPP代码崩溃

Rcpp code crashes R

本文关键字:崩溃 代码 RCPP      更新时间:2023-10-16

我有以下C 代码:

NumericVector testFromontcpp(NumericMatrix z1, NumericMatrix z2, int Nbootstrap){
  int dim1 = z1.nrow();
  int dim2 = z2.nrow();
  int dimension = z1.ncol();
  int N = dim1 + dim2;
  NumericVector TKeps(Nbootstrap+1);
  cout << "toto";
  double bb[N][N];
  cout << "toto";
  return(TKeps);
}

我使用RCPP软件包运行它:sourceCpp("...")。如果z1.size()不到500。

我想知道:

  • 我在这里做错了吗?
  • 还是RCPP中的大小问题?
  • 是否有解决方案可以使我的代码使用z1.size()> 0?

谢谢!

它甚至比马修(Matthew)说

更糟糕
 double bb[N][N];

只是错误,因为C/C 没有天然的二维结构。您始终创建一个长向量,然后使用巧妙的索引,请参见例如C代码中用于模拟矩阵的旧数值配方。

在这里,这很愚蠢,因为我们 do 具有矩阵类型,因此请使用一个:

 Rcpp::NumericMatrix bb(N,N);

较大的ISUE是,使用现代C 以及RCPP提供的类,您应该从不使用malloc/freenew/delete

尽管其他人所说的话,多维数组是完全有效的。但是,在运行时指定尺寸仅在C99中支持。编译器选择尊重这一点,但这不是标准。这是我使用clang和-pedantic选项得到的:

array.cpp:13:15: warning: variable length arrays are a C99 feature [-Wvla-extension]
  double bb[N][N];
              ^
array.cpp:13:12: warning: variable length arrays are a C99 feature [-Wvla-extension]
  double bb[N][N];
       ^

另请参阅此问题。

您的问题在此行中:

double bb[N][N];

正在分配堆栈上的大量元素,并且您的堆栈空间不足。而是在堆上分配。

如果可能的话,我将使用std::vector<std::vector<double>>。那是将其内存分配在堆上的资源处理。您没有指示您对bb做什么,所以我无法判断是否可能。

相关:https://stackoverflow.com/a/16411448/1290634