Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rcpp code crashes R

Tags:

c++

r

rcpp

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 :

  • Am I doing something wrong here ?
  • Or is this issue of size in Rcpp known ?
  • Is there a solution to make my code run with z1.size() >0 ?

Thank you !

like image 868
Pop Avatar asked Jan 30 '14 14:01

Pop


3 Answers

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.

like image 134
Dirk Eddelbuettel Avatar answered Nov 12 '22 19:11

Dirk Eddelbuettel


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.

like image 23
Romain Francois Avatar answered Nov 12 '22 20:11

Romain Francois


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

like image 4
Matthew Lundberg Avatar answered Nov 12 '22 20:11

Matthew Lundberg