[英]Why are the values I am pulling from my ruby array to my c extension wrong?
这个方法只是验证我能够正确地看到ruby数组的元素。
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);
}
但是当我使用该方法时,数组的元素是错误的。 奇怪的是,它看起来并不像我得到某种地址信息,因为打印的数字大小大致与ruby数组中的数字大小相对应。 每次创建新对象并运行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
我需要使用
printf("%d\n", NUM2INT(ary_ptr[i]));
rb_ary_entry
是从Ruby数组中获取内容的安全方法。 它们不像普通的C数组那样被访问。
似乎与这个问题有关: https : //stackoverflow.com/a/9619163/486990
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.