0

我是 Rcpp 的新手,所以仍然盲目地寻找我的方式。问题的长短是我有一个生成指针的对象,我希望该指针返回给 R。

我发现将指针转换为 a 可以size_t保持必要的精度,但是,我似乎无法使用wrap.

在下面的代码中,只返回unsigned long int将编译,其他的会抛出错误,为了篇幅我不在这里包含。对于我的对象,转换为 anunsigned long int会导致编译器由于精度丢失而失败(即在第一个块中全部被注释掉)。

使用 a应该足以满足我的需要,以避免为此类对象size_t创建模板的替代方法。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 的指针?

有一个非常明确定义的用例,它涉及 R 类型的“外部指针”(在第 5.13 节的编写 R 扩展手册中讨论)。举几个例子,R的外部指针被RODBC之类的包用来控制(外部)数据库连接对象,被bigmemory用来处理外部存储器,被我自己的RcppDE用来将编译的目标函数交给差分进化优化例程. 所有这些用途对我来说都是有意义的——而且我们有支持它的类型——但只是传递一个指针是没有意义的。Rcpp::XPtr

你能更清楚地解释为什么你需要一个指针吗?

(此外,如果您尝试在 rcpp-devel 上发帖,请确保您的 From: 地址与您订阅的地址完全相同。)

于 2012-01-19T18:35:06.027 回答