[#3109] Is divmod dangerous? — Dave Thomas <Dave@...>

14 messages 2000/06/06

[#3149] Retrieving the hostname and port in net/http — Roland Jesse <jesse@...>

Hi,

12 messages 2000/06/07

[#3222] Ruby coding standard? — Robert Feldt <feldt@...>

16 messages 2000/06/09

[#3277] Re: BUG or something? — Aleksi Niemel<aleksi.niemela@...>

> |I am new to Ruby and this brings up a question I have had

17 messages 2000/06/12
[#3281] Re: BUG or something? — Dave Thomas <Dave@...> 2000/06/12

Aleksi Niemel<aleksi.niemela@cinnober.com> writes:

[#3296] RE: about documentation — Aleksi Niemel<aleksi.niemela@...>

> I want to contribute to the ruby project in my spare time.

15 messages 2000/06/12

[#3407] Waffling between Python and Ruby — "Warren Postma" <embed@...>

I was looking at the Ruby editor/IDE for windows and was disappointed with

19 messages 2000/06/14

[#3410] Exercice: Translate into Ruby :-) — Jilani Khaldi <jilanik@...>

Hi All,

17 messages 2000/06/14

[#3415] Re: Waffling between Python and Ruby — Andrew Hunt <andy@...>

>Static typing..., hmm,...

11 messages 2000/06/14

[#3453] Re: Static Typing( Was: Waffling between Python and Ruby) — Andrew Hunt <andy@...>

32 messages 2000/06/16

[#3516] Deep copy? — Hugh Sasse Staff Elec Eng <hgs@...>

Given that I cannot overload =, how should I go about ensuring a deep

20 messages 2000/06/19

[#3694] Why it's quiet — hal9000@...

We are all busy learning the new language

26 messages 2000/06/29
[#3703] Re: Why it's quiet — "NAKAMURA, Hiroshi" <nahi@...> 2000/06/30

Hi,

[#3705] Re: Why it's quiet — matz@... (Yukihiro Matsumoto) 2000/06/30

Hi,

[ruby-talk:03563] Re: Extension in C++?

From: Robert Feldt <feldt@...>
Date: 2000-06-20 16:28:25 UTC
List: ruby-talk #3563
On Tue, 20 Jun 2000, ts wrote:

> >>>>> "R" == Robert Feldt <feldt@ce.chalmers.se> 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 <ruby.h>

#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);
}



In This Thread

Prev Next