From: Robert Feldt Date: 2000-06-20T18:28:25+02:00 Subject: [ruby-talk:03563] Re: Extension in C++? On Tue, 20 Jun 2000, ts wrote: > >>>>> "R" == Robert Feldt writes: > > R> rubycpp.cpp: In function `VALUE rbcpp_init(long unsigned int)': > R> rubycpp.cpp:16: ANSI C++ prohibits conversion from `(Func *)' to `(...)' > > Look at fltk : >... > #define RB_FINALIZER(func) ((void (*)(...))func) > #define RB_METHOD(func) ((VALUE (*)(...))func) > ... > Thanks a lot. For completeness I might point out that my original code was buggy (in case a newcomer (like me!) wants to try this themselves): The 'self' parameter in rbcpp_f will be of type T_OBJECT with the original code I posted. This leads to a ERR: (eval):1:in `f': wrong argument type Func (expected Data) when run in rubye. My workaround is to define new instead of initialize and return a DATA object so that 'self' will have the right type in 'f'. This will not work with more complex examples; you should probably save the wrapped structure in a object var. Since 'new' is a singleton method the code is slightly changed. See below. Regards, Robert Full and working code snippet showing Ruby/C++ integration: ----------------------------------------------------------- #include #define RB_FINALIZER(func) ((void (*)(...))func) #define RB_METHOD(func) ((VALUE (*)(...))func) class Func { public: int f(int x) { return 2*x; } }; VALUE cFunc; static void rbcpp_free(Func* obj) { delete obj; } //static VALUE rbcpp_init(VALUE self) { static VALUE rbcpp_new() { Func* new_obj = new Func; return Data_Wrap_Struct(cFunc, 0, RB_FINALIZER(rbcpp_free), new_obj); } static VALUE rbcpp_f(VALUE self, VALUE x) { Func* obj; Data_Get_Struct(self, class Func, obj); return INT2FIX(obj->f(NUM2INT(x))); } extern "C" void Init_rubycpp() { cFunc = rb_define_class("Func", rb_cObject); rb_define_method(cFunc, "f", RB_METHOD(rbcpp_f), 1); // rb_define_method(cFunc, "initialize", RB_METHOD(rbcpp_init), 0); rb_define_singleton_method(cFunc, "new", RB_METHOD(rbcpp_new), 0); }