Rcpp代码崩溃了R.

时间:2014-01-30 14:16:48

标签: c++ r rcpp

我有以下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,它的效果很好。但是对于更高的尺寸,它会在打印第二个“toto”之前崩溃并关闭R.

我想知道:

  • 我在这里做错了吗?
  • 或者这个Rcpp的大小问题是否已知?
  • 是否有解决方案让我的代码与z1.size()&gt; 0?
  • 一起运行

谢谢!

3 个答案:

答案 0 :(得分:10)

这比马修所说的更糟糕

 double bb[N][N];

只是错误,因为C / C ++没有原生的二维结构。你总是创建一个长向量,然后使用聪明的索引,参见例如用于模拟矩阵的C代码中的旧数字配方。

在这里,这很简单,因为我们有矩阵类型,所以请使用一个:

 Rcpp::NumericMatrix bb(N,N);

对于现代C ++以及Rcpp提供的类,您应该从不必须使用malloc / freenew / delete

答案 1 :(得分:8)

尽管其他人已经说过,多维数组完全有效。但是,仅在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];
       ^

另请参阅与此相关的question

答案 2 :(得分:4)

你的问题在这一行:

double bb[N][N];

那就是在堆栈上分配大量元素,而你的堆栈空间已经用完了。而是在堆上分配。

如果可能的话,我会使用std::vector<std::vector<double>>。这是一个在堆上分配内存的资源句柄。你没有说明你对bb做了什么,所以我不知道是否可能。

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