[Rcpp-devel] c++ class as argument in rcpp function (using modules)
Yasir Suhail
yusuhail at gmail.com
Thu Dec 22 01:52:46 CET 2011
Hi,
Other than the approaches mentioned, I can also specialize an
as<World>(SEXP) as
template <>
World as<World>(SEXP x) {
Rcpp::XPtr<World> ptr(x);
return World(ptr->greet());
}
However, this also gives segfault at runtime when addMsg is called. The
final code, with alternative implementations commented out for
experimentation is:
#include <RcppCommon.h>
#include <string>
class World {
public:
World() : msg("hello"){}
World(const std::string s) : msg(s){}
void set(std::string msg) { this->msg = msg; }
std::string greet() const { return msg; }
void addMsg(const World w2) {
this->msg = this->msg + w2.greet();
}
// World(SEXP x);
/* World(SEXPREC* &w2) {
msg = ((World*)w2)->greet();
}
*/
private:
std::string msg;
};
namespace Rcpp{
template <> SEXP wrap(const World& object);
template <> World as<World>(SEXP x);
}
#include <Rcpp.h>
namespace Rcpp {
template <>
SEXP wrap( const World& object ){
Language call( "new", Symbol( "World" ), object.greet() ) ;
return call.eval() ;
}
template <>
World as<World>(SEXP x) {
Rcpp::XPtr<World> ptr(x);
return World(ptr->greet());
}
}
/*World::World(SEXP x) {
Rcpp::XPtr<World> ptr(x);
msg = ptr->greet();
}*/
//...
RCPP_MODULE(yada){
using namespace Rcpp ;
class_<World>( "World" )
// expose the default constructor
.constructor()
.constructor<std::string>()
.method( "greet", &World::greet , "get the message" )
.method( "set", &World::set , "set the message" )
.method( "addMsg", &World::addMsg , "add the message from another object"
);
}
Then, running with R -d gdb
> a <- new(World,"hello ")
> b <- new(World,"worlds")
> a$greet( )
[1] "hello "
> a$addMsg( b)
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000011000078
0x00000001042032df in std::basic_string<char, std::char_traits<char>,
std::allocator<char> >::basic_string ()
(gdb) bt
#0 0x00000001042032df in std::basic_string<char, std::char_traits<char>,
std::allocator<char> >::basic_string ()
#1 0x0000000104358b18 in Rcpp::as<World> ()
#2 0x000000010435d564 in Rcpp::CppMethod1<World, void, World>::operator()
()
#3 0x000000010435eadb in Rcpp::class_<World>::invoke_void ()
#4 0x0000000104164670 in CppMethod__invoke_void ()
#5 0x00000001000928e9 in do_External ()
#6 0x00000001000c4af7 in Rf_eval ()
#7 0x00000001000c6d99 in do_begin ()
#8 0x00000001000c48af in Rf_eval ()
#9 0x00000001000c7cf3 in Rf_applyClosure ()
#10 0x00000001000c4778 in Rf_eval ()
#11 0x00000001000fed75 in Rf_ReplIteration ()
#12 0x00000001000ff021 in R_ReplConsole ()
#13 0x00000001000ff590 in run_Rmainloop ()
#14 0x0000000100000e8b in main ()
(gdb)
Thanks!
On Wed, Dec 21, 2011 at 7:41 PM, Darren Cook <darren at dcook.org> wrote:
> Hello Yasir,
> Could you post your complete (minimal) code to the list. Then someone
> might be curious enough to try reproducing the problem.
>
> Darren
>
>
> On 2011-12-22 08:29, Yasir Suhail wrote:
> > Thanks Darren, Douglas, Richard, and Dirk!
> >
> > I can compile with the following definitions:
> >
> > World(SEXP x) {
> > Rcpp::XPtr<World> ptr(x);
> > msg = ptr->msg;
> > }
>
> > ...
>
>
> --
> Darren Cook, Software Researcher/Developer
>
> http://dcook.org/work/ (About me and my work)
> http://dcook.org/blogs.html (My blogs and articles)
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20111221/bc5c1c21/attachment-0001.htm>
More information about the Rcpp-devel
mailing list