Я новичок в Rcpp, так что все еще слепо нахожу свой путь. Долгое и короткое дело в том, что у меня есть объект, который генерирует указатель, и я хочу, чтобы этот указатель вернулся к R.Return Wrap of size_t в Rcpp
Я обнаружил, что при наведении указателя на size_t
сохраняется необходимая точность, однако я, кажется, не чтобы иметь возможность вернуть это с помощью wrap
.
В приведенном ниже коде возвращаем только unsigned long int
, остальные забрасывают ошибки, которые ради места я не буду включать здесь. И с моей целью приведение к unsigned long int
приводит к сбою компилятора из-за потери точности (это в первом блоке, который все закомментирован).
Использование size_t
должно быть достаточным для моих нужд, чтобы избежать альтернативы создания шаблона wrap
для этого типа объекта.
Я проверил changelog, и кажется, что size_t должен поддерживаться. overview также предлагает wrap
поддержка для size_t
.
#include <Rcpp.h>
#include <iostream>
using namespace Rcpp;
using namespace std;
extern "C" SEXP attempt()
{
// this block if uncommented gives compile error that converting a pointer to unsigned long int loses precision
// also, wrapping the pointer &f causes a compilation error
//int f = 314;
//unsigned long int theVar_longint = (unsigned long int) &f;
//cout << "pointer: " << &f << endl;
//return(wrap(&f));
// This block makes an arbitrary value into a size_t, unsigned long int and unsigned long long int
size_t theVar_sizet = (size_t) 383762523;
unsigned long int theVar_longint = (unsigned long int) 383762523;
unsigned long long int theVar_longlongint = (unsigned long long int) 383762523;
// prints the results
cout << "size_t: " << theVar_sizet << endl;
cout << "longint: " << theVar_longint << endl;
cout << "longlongint: " << theVar_longlongint << endl;
// only the first line returns properly, the others cause errors in compilation
return(wrap(theVar_longint));
//return(wrap(theVar_longlongint));
//return(wrap(theVar_sizet));
}
Вы попробовали R_xlen_t? –