Я экспериментирую с Rcpp, чтобы увидеть, как работает проверка границ:
> cppFunction ('double fun(){NumericVector v(5); return v[-10];}', rebuild=T)
> fun()
[1] 1.782105e-316
> cppFunction ('double fun(){NumericVector v(5); return v[5];}', rebuild=T)
> fun()
[1] 5.323385e-316
> cppFunction ('NumericVector fun(){NumericMatrix v(5, 5); return v(6,_);}', rebuild=T)
> fun()
Error: index out of bounds
> cppFunction ('double fun(){NumericMatrix v(5, 5); return v(6,1);}', rebuild=T)
> fun()
[1] 0
Я не могу понять, как это работает. Я ожидал ошибку "индекс за пределами границ" для всех 4 из них. Что делать, чтобы он всегда работал как для векторов, так и для матриц? Вот несколько подробных результатов компиляции:
Generated R functions
-------------------------------------------------------
'.sourceCpp_81484_DLLInfo' <- dyn.load('/tmp/RtmprtDNus/sourcecpp_5b065bfe9a2d/sourceCpp_20261.so')
fun <- Rcpp:::sourceCppFunction(function() {}, FALSE, '.sourceCpp_81484_DLLInfo', 'sourceCpp_81484_fun')
rm('.sourceCpp_81484_DLLInfo')
Building shared library
--------------------------------------------------------
DIR: /tmp/RtmprtDNus/sourcecpp_5b065bfe9a2d
/usr/lib/R/bin/R CMD SHLIB -o 'sourceCpp_20261.so' --preclean 'file5b0652a2d520.cpp'
g++ -I/usr/share/R/include -DNDEBUG -I"/home/user/R/x86_64-pc-linux-gnu-library/3.0/Rcpp/include" -fpic -O3 -pipe -g -c file5b0652a2d520.cpp -o file5b0652a2d520.o
g++ -shared -o sourceCpp_20261.so file5b0652a2d520.o -L/usr/lib/R/lib -lR
Нужно ли мне модифицировать аргументы -O3 или -DNDEBUG?
Для двух первых примеров нет проверок границ. Оценки оценок дорогие. То, что вы получаете, - это неопределенное поведение. Признаки в этом случае вы получаете мусор, но вы также можете получить segfault.
В третьем примере используйте _
placeholder для извлечения строки. При построении объекта MatrixRow
, представляющего концепцию строки, генерируется исключение, потому что такой строки нет. Вы можете рассуждать, что здесь стоит сделать проверку границ, так как она проверяет "всю строку".
Ваш последний пример выглядит как ошибка. вероятно, в Vector :: offset