0

私はRcppを初めて使用するので、まだ盲目的に自分の道を見つけています。問題の長所と短所は、ポインターを生成するオブジェクトがあり、そのポインターをRに返したいということです。

ポインタをにキャストすると必要な精度が維持されることがわかりましたが、。size_tでそれを返すことはできないようですwrap

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

このタイプのオブジェクトのテンプレートをsize_t作成するという選択肢を避けるために、私のニーズにはsを使用するだけで十分です。wrap

変更ログを確認しましたが、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));
}
4

2 に答える 2

1

size_t、long int、long long int は実際にはプラットフォームに依存するため、それらに依存しないようにアドバイスします。つまり、R 側にラップアウトします。

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

于 2012-01-23T12:14:50.903 に答える
0

私は少し混乱しています: 定義上、ポインタは (一時的な?) メモリ位置を指します。Rへのポインタを返すのはなぜですか?

非常に明確に定義されたユース ケースが 1 つあります。これには、R 型の「外部ポインター」が含まれます ( R 拡張機能の記述マニュアルのセクション 5.13で説明されています)。いくつかの例を挙げると、R の外部ポインターは、R​​ODBC のようなパッケージで (外部) データベース接続オブジェクトを制御するために使用され、 bigmemoryでは外部メモリーと連携し、私自身のRcppDEではコンパイルされた目的関数を微分進化最適化ルーチンに渡すために使用されます。 . これらの使用法はすべて私にとって理にかなっています---そしてそれRcpp::XPtrをサポートする型があります---しかし、ポインターを渡すだけでは意味がありません。

ポインタが必要な理由をもっと明確に説明できますか?

(また、rcpp-devel に投稿しようとした場合は、From: アドレスが購読したアドレスと正確に同じであることを確認してください。)

于 2012-01-19T18:35:06.027 に答える