2012-01-19 7 views
0

私はRcppを初めて使っています。問題の長短は、ポインタを生成するオブジェクトがあり、そのポインタをRに戻すことです。Rcppでsize_tの折り返しを返します。

ポインタをsize_tにキャストすると必要な精度が維持されていますが、 wrapでそれを返すことができます。

以下のコードでは、unsigned long intを返すだけでコンパイルできますが、他はエラーが発生しますが、これはスペースのためにここには含まれません。私のオブジェクトでは、unsigned long intにキャストすると、精度が失われたためにコンパイラが失敗します(最初のブロックにはすべてコメントアウトされています)。

size_tを使用すると、このタイプのオブジェクトに対してwrapテンプレートを作成する代わりの方法を避けるために十分です。

私はchangelogを確認しました。それはsize_tがサポートされているようです。 overviewsize_tのためのwrapのサポートも示唆しています。

#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へのポインタを返しますか?

非常に明確に定義されたユースケースが1つあり、Rタイプの「外部ポインタ」(Writing R ExtensionsマニュアルのSection 5.13で説明しています)が含まれています。いくつか例を挙げると、Rの外部ポインタはRODBCのようなパッケージによって(外部)データベース接続オブジェクトを制御するために使用されます。bigmemoryは外部メモリで動作し、私自身のRcppDEは差分進化最適化ルーチン。これらすべての使用法は私には意味があります---サポートするタイプはRcpp::XPtrですが、ポインタを渡すだけではありません。

なぜポインタが必要なのかをより明確に説明できますか?

(あなたはrcpp-develのに投稿しようとした場合にも、あなたからのことを確認します。アドレスは正確にあなたが登録したアドレスと同じである)

+0

rcpp-develへの投稿はまったく異なる質問のためでしたが、同じ正確な住所からではなく、私は再送します。 – Jared

+0

この問題については、khash(https://github.com/attractivechaos/klib/blob/master/khash.h)に基づいてハッシング機能を構築しようとしています。限り、私はそれがハッシュテーブルが格納されているメモリブロックへのポインタを返して言うことができます。だから私は場所を指すRオブジェクトを作って、テーブルのキーと値にアクセスできると思った。 – Jared

+0

いいえ、Rはランダムなプログラムのメモリを読み込めないので(少なくとも信頼性と移植性の高い方法ではない、恐れる)、あなたはそれを行うことができないのではないかと恐れています。あなたができることは、データを含む(永続的な)クラスを作成し、khashまたはその他の手段を使ってハッシングを実装することです。次に、データを保持しているクラスと通信するための「ゲッター」と「セッター」を提供することができます。 –

1

何size_tの、実際に長いintとlong long int型プラットフォームに依存しているので、私はそれらに頼らないこと、すなわちR側にそれらをラップすることを勧めます。

int64パッケージを使用して64ビットの整数型をサポートしようとしましたが、これによっていくつかの問題が発生し、これが修正されます。これが完了すると、32ビットの整数(int)または64ビットの整数(int64_t)のいずれかをラップすることができます。 size_t、longまたはlong longの使用をお勧めします。

関連する問題