[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

easiest way to access rb_sprintf

Alex Fenton

8/18/2008 1:31:00 PM

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
3 Answers

Tim Hunter

8/18/2008 2:06:00 PM

0

Alex Fenton 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.
--
Posted via http://www.ruby-....

Nobuyoshi Nakada

8/18/2008 6:26:00 PM

0

Hi,

At Mon, 18 Aug 2008 22:31:41 +0900,
Alex Fenton 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);
> }

--
Nobu Nakada

Alex Fenton

8/19/2008 1:25:00 AM

0

Nobuyoshi Nakada 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