Easiest way to access rb_sprintf

Hi

I want to create a ruby method in a C++ extension that will spit out the
C++ pointer address of the wrapped object - useful for debugging. I
have got the following, which works, but I was wondering if there was an
easier way to access this that I’m missing?

static VALUE
cpp_ptr_addr(VALUE self, VALUE obj)
{
size_t ptr = (size_t)DATA_PTR(obj);
return rb_funcall( rb_mKernel, rb_intern(“sprintf”), 2,
rb_str_new2(“0x%x”), OFFT2NUM(ptr) );
}

thanks
alex

Alex F. wrote:

Hi

I want to create a ruby method in a C++ extension that will spit out the
C++ pointer address of the wrapped object - useful for debugging. I
have got the following, which works, but I was wondering if there was an
easier way to access this that I’m missing?

static VALUE
cpp_ptr_addr(VALUE self, VALUE obj)
{
size_t ptr = (size_t)DATA_PTR(obj);
return rb_funcall( rb_mKernel, rb_intern(“sprintf”), 2,
rb_str_new2(“0x%x”), OFFT2NUM(ptr) );
}

thanks
alex

Instead of calling Ruby’s sprintf, use C’s standard sprintf with the %p
conversion specifier, then convert the result to a Ruby string.

Hi,

At Mon, 18 Aug 2008 22:31:41 +0900,
Alex F. wrote in [ruby-talk:311670]:

I want to create a ruby method in a C++ extension that will spit out the
C++ pointer address of the wrapped object - useful for debugging. I
have got the following, which works, but I was wondering if there was an
easier way to access this that I’m missing?

rb_sprintf is a function added in 1.9, and you can use it like
printf.

static VALUE
cpp_ptr_addr(VALUE self, VALUE obj)
{
void *ptr = DATA_PTR(obj);
return rb_sprintf("%p", ptr);

Nobuyoshi N. wrote:

static VALUE
cpp_ptr_addr(VALUE self, VALUE obj)
{
void *ptr = DATA_PTR(obj);
return rb_sprintf("%p", ptr);
}

excellent, thank you both. i’m ultimately targetting 1.9 so this is
ideal.

alex

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs