Я новичок в Rcpp, поэтому все еще слепо нахожу свой путь.Суть проблемы заключается в том, что у меня есть объект, который генерирует указатель, и я хочу, чтобы этот указатель был возвращен в R.
Я считаю, что приведение указателя к size_t
поддерживает необходимую точность, однакоКажется, я не могу вернуть это с wrap
.
. В приведенном ниже коде компилируется только возвращение unsigned long int
, другие выдают ошибки, которые я не буду включать ради пространства.Вот.А с моим объектом приведение к unsigned long int
приводит к сбою компилятора из-за потери точности (это первый закомментированный блок).
Использование size_t
должно быть достаточно для моих нужд, так какчтобы избежать альтернативы создания wrap
шаблона для этого типа объекта.
Я проверил changelog , и кажется, что size_t должен поддерживаться. обзор также предлагает 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));
}