[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

converting strings in c extension

Niklas C.

4/29/2008 12:51:00 AM

While trying to bind some old C code to ruby I ran into trouble
converting strings. The function in question requires two string
arguments (const char*). This is the relevant part of my binding:

...
static VALUE rb_ldist(VALUE s, VALUE t)
{
return INT2FIX(ldist(StringValuePtr(s),StringValuePtr(t)));
}
...

Compilation works without warnings, but when I try to use the function
in ruby with

ldist 'foo','bar'

it gives me

can't convert Object into String (TypeError)

Why is it an Object and not a String?

I also tried to use RSTRING(s)->ptr insead of StringValuePtr, but that
gave me an invalid pointer.

Any suggestions on what to do here?

thanks in advance for any help.
--
Posted via http://www.ruby-....

4 Answers

Joel VanderWerf

4/29/2008 2:30:00 AM

0

Niklas C. wrote:
> While trying to bind some old C code to ruby I ran into trouble
> converting strings. The function in question requires two string
> arguments (const char*). This is the relevant part of my binding:
>

Try adding the following lines to see what the objects really are:

> ...
> static VALUE rb_ldist(VALUE s, VALUE t)
> {
rb_p(s);
rb_p(t);
> return INT2FIX(ldist(StringValuePtr(s),StringValuePtr(t)));
> }
> ...

(Btw, README.EXT should mention this function. It's very useful.)

--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

Andre Nathan

4/29/2008 3:02:00 AM

0

On Tue, 2008-04-29 at 11:30 +0900, Joel VanderWerf wrote:
> (Btw, README.EXT should mention this function. It's very useful.)

Argh. I've been doing

rb_funcall(rb_mKernel, rb_intern("p"), 1, obj);

all this time...


Thanks for mentioning this :)

Andre


Niklas C.

4/29/2008 5:16:00 AM

0

Whow, that really gave me a hint!
Doing
ldist 'foo','bar'
now prints:

main
'foo'

So for some reason main is given as the first argument. Does ruby always
do that? doesn't make much sense to me...

Anyway, I solved the problem by adding another (first) parameter to
rb_ldist, but still specifying 2 parameters down in the rb_define_method
call. Seems like a dirty hack but it's working, thank's a lot ;)


Joel VanderWerf wrote:
> Niklas C. wrote:
>> While trying to bind some old C code to ruby I ran into trouble
>> converting strings. The function in question requires two string
>> arguments (const char*). This is the relevant part of my binding:
>>
>
> Try adding the following lines to see what the objects really are:
>
>> ...
>> static VALUE rb_ldist(VALUE s, VALUE t)
>> {
> rb_p(s);
> rb_p(t);
>> return INT2FIX(ldist(StringValuePtr(s),StringValuePtr(t)));
>> }
>> ...
>
> (Btw, README.EXT should mention this function. It's very useful.)

--
Posted via http://www.ruby-....

Adam Shelly

4/29/2008 5:38:00 AM

0

On Mon, Apr 28, 2008 at 10:15 PM, Niklas C. <cathor.niklas@gmail.com> wrote:
> Whow, that really gave me a hint!
> Doing
> ldist 'foo','bar'
> now prints:
>
> main
> 'foo'
>
> So for some reason main is given as the first argument. Does ruby always
> do that? doesn't make much sense to me...

The first argument is always 'self' - the object that the method is
being called on. Your function definition should always have 1 more
parameter than rb_define_method specifies.
>
> Anyway, I solved the problem by adding another (first) parameter to
> rb_ldist, but still specifying 2 parameters down in the rb_define_method
> call. Seems like a dirty hack but it's working, thank's a lot ;)
>
So it's not really a dirty hack - just rename your dummy to 'self' and
you are doing the right thing.

-Adam