开发者

Why are the values I am pulling from my ruby array to my c extension wrong?

This method is just verifying that I'm able to see the elements of a ruby array correctly.

static VALUE 
print_cards(self) 
  VALUE self;
{
    VALUE cards;
    int i;

    cards = rb_ivar_get(self, rb_intern("@cards"));
    VALUE *ary_ptr = RARRAY_PTR(cards);
    int ary_length = RARRAY_LEN(cards);

    for(i=0; i< ary_length; i++)
        printf("%d\n", ary_ptr[i]);

  return 开发者_StackOverflow中文版Qnil;
}

void Init_ev() {
    rb_eval_string("require './lib/ev/pair_counter'");
    VALUE PairCounter = rb_path2class("EV::PairCounter");
    rb_define_method(PairCounter, "print_cards", print_cards, 0);
}

But when I put the method to use, the elements of the array are wrong. The strange thing is that it doesn't look like I'm getting some kind of address information, since the size of the number that is printed roughly corresponds with the size of the number in the ruby array. The numbers are also consistent each time I create a new object and run print_cards.

ruby-1.9.2-p180 :001 > p = EV::PairCounter.new   #=> #<EV::PairCounter:0x000001046a10f8 @pairs={}, @cards=[]>
ruby-1.9.2-p180 :002 > p.add_card(1)   #=> 1
ruby-1.9.2-p180 :003 > p.print_cards
3                                      #=> nil
ruby-1.9.2-p180 :004 > p.add_card(5)   #=> 2
ruby-1.9.2-p180 :005 > p.add_card(88)   #=> 3
ruby-1.9.2-p180 :006 > p
=> #<EV::PairCounter:0x000001046a10f8 @pairs={1=>1, 5=>1, 88=>1}, @cards=[1, 5, 88]>
ruby-1.9.2-p180 :007 > p.print_cards
3
11
177                 


I needed to use

printf("%d\n", NUM2INT(ary_ptr[i]));


rb_ary_entry is the safe way to get the content from a Ruby array. They are not accessed like normal C arrays.

Seems to be related to this question: https://stackoverflow.com/a/9619163/486990

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜