我有以下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.
我想知道:
z1.size()
&gt; 0?谢谢!
答案 0 :(得分:10)
这比马修所说的更糟糕
double bb[N][N];
只是错误,因为C / C ++没有原生的二维结构。你总是创建一个长向量,然后使用聪明的索引,参见例如用于模拟矩阵的C代码中的旧数字配方。
在这里,这很简单,因为我们做有矩阵类型,所以请使用一个:
Rcpp::NumericMatrix bb(N,N);
对于现代C ++以及Rcpp提供的类,您应该从不必须使用malloc
/ free
或new
/ 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
做了什么,所以我不知道是否可能。