Вернуть Wrap size_t в Rcpp - PullRequest
       6

Вернуть Wrap size_t в Rcpp

0 голосов
/ 19 января 2012

Я новичок в 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));
}

Ответы [ 2 ]

1 голос
/ 23 января 2012

То, что на самом деле size_t, long int и long long int, зависит от платформы, поэтому я бы не советовал полагаться на них, то есть переносить их на сторону R.

Мы попытались исключить 64-битные целочисленные типы с помощью пакета int64, но это вызвало некоторые проблемы, которые будут исправлены. Когда это будет сделано, вы сможете обернуть 32-битные целые (int) или 64-битные целые (int64_t). Я бы не рекомендовал использовать size_t, long или long long.

0 голосов
/ 19 января 2012

Я немного запутался: указатель по определению указывает на (временную?) Область памяти. Зачем вам возвращать указатель на R?

Существует один очень четко определенный вариант использования, который включает в себя «внешний указатель» R-типа (обсуждается в руководстве Запись R-расширений в Раздел 5.13 ). Чтобы назвать несколько примеров, внешние указатели R используются пакетами, такими как RODBC для управления (внешним) объектом подключения к базе данных, bigmemory для работы с внешней памятью и моей собственной RcppDE для передачи скомпилированной целевой функции в процедуру оптимизации дифференциальной эволюции. Все эти варианты использования имеют смысл для меня - и у нас есть тип Rcpp::XPtr для его поддержки - но просто передать указатель - нет.

Можете ли вы объяснить более четко, зачем вам указатель?

(Кроме того, если вы пытались публиковать сообщения на rcpp-devel, убедитесь, что ваш адрес From: точно совпадает с адресом, на который вы подписаны.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...