2012-01-19 1 views
0

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

Вы попробовали R_xlen_t? –

ответ

0

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

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

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

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

+0

Сообщение для rcpp-devel было для совершенно другого вопроса, но не с того же точного адреса, я отправлю его повторно. – Jared

+0

Что касается этой проблемы, я пытаюсь создать хэширование на основе хаша (https://github.com/attractivechaos/klib/blob/master/khash.h). Насколько я могу судить, он возвращает указатель на блок памяти, где хранится хеш-таблица. Поэтому я подумал, что могу создать объект R, указывающий на местоположение, и затем получить доступ к ключам и значениям в таблице. – Jared

+0

Нет, боюсь, вы не сможете этого сделать, поскольку я не могу читать случайную память программы (или, по крайней мере, не надежно и переносимо, боюсь). То, что вы можете сделать, это создать (постоянный) класс, который содержит данные и реализует хеширование через хаш или некоторые другие средства. Затем вы можете предоставить «getter» и «setter» для связи с классом, содержащим данные. –

1

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^