I have the following C++ code :
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);
}
I run it with Rcpp package : sourceCpp("...")
. It works well if z1.size()
is under 500. But for higher sizes, it crashes and closes R before the second "toto" is printed.
I would like to know :
z1.size()
>0 ?Thank you !
It is even worse than Matthew says as
double bb[N][N];
is simply wrong as C / C++ have no native two-dimensional structure. You always create a long vector and then use clever indexing into it, see e.g. the old Numerical Recipes in C code for emulating matrices.
Here, this is plain silly as we do have matrix types, so use one:
Rcpp::NumericMatrix bb(N,N);
The bigger isue that with modern C++, as well as the classes provided by Rcpp, you should never have to use malloc
/free
or new
/delete
.
Despite what others have said, multi dimensional arrays are perfectly valid. However, specifying the dimensions at runtime is only supported in C99. Compilers choose to honour that, but it is not standard. Here is what I get with clang and the -pedantic
option:
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];
^
See also this question which is related.
Your problem is in this line:
double bb[N][N];
That is allocating a large number of elements on the stack, and you're running out of stack space. Allocate on the heap instead.
If possible, I would use a std::vector<std::vector<double>>
for this. That is a resource handle that allocates its memory on the heap. You don't indicate what you're doing with bb
, so I can't tell whether it is possible.
Related: https://stackoverflow.com/a/16411448/1290634
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With