Why are the values ​​that I pull from my ruby ​​array into extension c wrong?

This method just checks that I can correctly see the elements of the ruby ​​array.

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 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 use the method to use, the array elements are erroneous. It is strange that this does not look like I am receiving any address information, since the size of the printed number approximately corresponds to the size of the number in the ruby ​​array. The numbers are also consistent every 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 
+4
source share
2 answers

I needed to use

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

rb_ary_entry is a safe way to get content from a Ruby array. They are not available, like regular C-arrays.

This seems to be related to this question: fooobar.com/questions/1359076 / ...

0
source

All Articles