Ruby with C

D

dogwasstar

I am new at programming ruby with C. I am trying to pass in a value from
a test ruby program to my C class and trying to print it out. But when i
print it out i am getting the wrong number printerd out.

Here is what i am trying to do.

Here is the ruby test file

class TestTest < Test::Unit::TestCase
def test_test
k = PKey.new('4')
assert_equal(Object, PKey.superclass)
assert_equal(PKey, k.class)
trtying = k.bit(5)
end
end

Here is the C file

static VALUE t_bit(VALUE self, VALUE obj)
{
VALUE n;

n = NUM2INT(obj);
printf("Fun %d", INT2NUM(n));
return Qnil;
}


Any suggestion would be helpfull. Thanks
 
H

Harold Hausman

Here is the C file

static VALUE t_bit(VALUE self, VALUE obj)
{
VALUE n;

n = NUM2INT(obj);
printf("Fun %d", INT2NUM(n));
return Qnil;
}

Hi.

By putting the variable 'n' through the INT2NUM macro as you pass it
into printf you're re-converting it back into a Ruby VALUE which is
not what you want to do. It will give you unpredictable (or at least
more-difficult-to-predict ;) ) results...

Assuming you just want to print the value of 'obj' as an integer, you
should probably declare 'n' as an integer instead of as a VALUE, and
use the NUM2INT (as you have) to convert the Ruby VALUE 'obj' into a
plain int. Then you can pass it straight into printf (as you would
with any other int) ... no need for INT2NUM there.

hope that helps,
-Harold
 
R

Ryan Davis

Your question has already been answered. Alternatively, use inline to
learn without all the hassle (no makefile, no builds, no type
conversions, no time wasted). Just try out what you want to do
straight up in ruby with inlined C, and then go look at what the C
code is producing:

#!/usr/local/bin/ruby

require 'rubygems'
require 'inline'

class PKey
inline do |builder|
builder.c <<-EOM
static void bit(int n) {
printf("Fun %d\\n", n);
}
EOM
end
end

k = PKey.new
k.bit(5)

############################################################
# Produces:
#
# #include "ruby.h"
#
# # line 9 "./blah.rb"
# static VALUE bit(VALUE self, VALUE _n) {
# int n = FIX2INT(_n);
#
# printf("Fun %d\n", n);
# return Qnil;
# }
#
# #ifdef __cplusplus
# extern "C" {
# #endif
# void Init_Inline_PKey_f671() {
# VALUE c = rb_cObject;
# c = rb_const_get_at(c,rb_intern("PKey"));
# rb_define_method(c, "bit", (VALUE(*)(ANYARGS))bit, 1);
#
# }
# #ifdef __cplusplus
# }
# #endif
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,230
Members
46,819
Latest member
masterdaster

Latest Threads

Top