我有以下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
/free
或new
/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