#rcpp
Вопрос:
В C при использовании vector
типов из STL некоторые компиляторы, такие как GCC, имеют такие параметры компиляции, как, например _GLIBCXX_ASSERTIONS
, принудительное добавление связанных проверок для векторов в отладочных сборках, так что если я попытаюсь получить доступ к элементу в позиции, превышающей вектор, это приведет к ошибке.
У RcppArmadillo есть аналогичный макрос отладки, который можно включить для проверки границ.
Есть ли в Rcpp что-то подобное для таких классов, как Rcpp::NumericVector
или Rcpp::IntegerVector
?
Ответ №1:
Да, это так:
> Rcpp::cppFunction("IntegerVector foo(IntegerVector v) { v.at(11) = 42L;
return v; }")
> foo( 1:10 )
Error in foo(1:10) : Index out of bounds: [index=11; extent=10].
>
Вы также можете рассмотреть RcppArmadillo, где у Armadillo есть проверки по умолчанию с возможностью отключения:
> Rcpp::cppFunction("arma::vec foo(arma::vec v) { v(11) = 42L;
return v; }", depends="RcppArmadillo")
> foo( 1:10 )
Error in foo(1:10) : Mat::operator(): index out of bounds
>
Комментарии:
1. Но для этого вам пришлось воспользоваться
.at()
, в то время_GLIBCXX_ASSERTIONS
operator[]
как вы тоже можете включить его. Будет ли#define
для этого какой-то вариант или нет?