Сбой кода Rcpp R

У меня есть следующий код на С++:

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";
 ****** bb[N][N];
 cout << "toto";
 return(TKeps);
}

Я запускаю его с пакетом Rcpp: sourceCpp("..."). Он работает хорошо, если z1.size() меньше 500. Но для более высоких размеров он сбрасывает и закрывает R до того, как будет напечатано второе "toto".

Я хотел бы знать:

  • Я делаю что-то не так здесь?
  • Или эта проблема размера в Rcpp известна?
  • Есть ли решение сделать мой код с z1.size() > 0?

Спасибо!

3 ответа

Это еще хуже, чем говорит Мэтью:

****** bb[N][N];

просто неверно, поскольку C/С++ не имеет собственной двумерной структуры. Вы всегда создаете длинный вектор, а затем используете умную индексацию в нем, см., Например, старые численные рецепты в коде C для эмуляции матриц.

Здесь это глупо, поскольку мы делаем имеют типы матриц, поэтому используйте один:

Rcpp::NumericMatrix bb(N,N);

Чем больше значение имеет современный С++, но и классы, предоставляемые Rcpp, вам никогда не придется использовать malloc/free или new/delete.


Несмотря на то, что говорили другие, многомерные массивы совершенно верны. Однако указание размеров во время выполнения поддерживается только на C99. Компиляторы предпочитают соблюдать это, но это не стандарт. Вот что я получил с помощью clang и -pedantic:

array.cpp:13:15: warning: variable length arrays are a C99 feature [-Wvla-extension]
 ****** bb[N][N];
 ^
array.cpp:13:12: warning: variable length arrays are a C99 feature [-Wvla-extension]
 ****** bb[N][N];
 ^

Смотрите также этот question, который связан.


Ваша проблема в этой строке:

****** bb[N][N];

Это выделяет большое количество элементов в стеке, и у вас заканчивается пространство стека. Выделите вместо этого кучу.

Если возможно, я бы использовал для этого std::vector<std::vector<******>></std::vector<******>. Это дескриптор ресурса, который выделяет свою память в куче. Вы не указываете, что делаете с bb, поэтому я не могу сказать, возможно ли это.

Связано: qaru.site/questions/944409/...

licensed under cc by-sa 3.0 with attribution.