如何从我的c扩展中访问ruby数组?

我收到了这个错误

ev.c:11: error: subscripted value is neither array nor pointer 

这条线

 printf("%d\n", pairs[0][0]); 

在这段代码中

 static VALUE EV; static VALUE PairCounter; static VALUE sort_pairs_2(VALUE self) { VALUE pairs; pairs = rb_ivar_get(self, rb_intern("pairs")); printf("%d\n", pairs[0][0]); return Qnil; } void Init_ev() { rb_eval_string("require './lib/ev/pair_counter'"); VALUE PairCounter = rb_path2class("EV::PairCounter"); rb_define_method(PairCounter, "sort_pairs_2", sort_pairs_2, 0); } 

我是否正确使用自我,并且rb_ivar_get实际上并未指向PairCounter类?

我很确定你需要在pairs上使用RARRAY_PTR宏来获取底层数组; 例如,Array#push(for 1.9.2)的内部实现如下所示:

 static VALUE rb_ary_push_1(VALUE ary, VALUE item) { long idx = RARRAY_LEN(ary); if (idx >= ARY_CAPA(ary)) { ary_double_capa(ary, idx); } RARRAY_PTR(ary)[idx] = item; ARY_SET_LEN(ary, idx + 1); return ary; } 

if只是排除任何必要的大小调整,然后有RARRAY_PTR(ary)[idx]用于访问数组中的单个插槽。

我没有任何官方参考支持这一点,但希望这将有一些用处。

使用rb_函数访问Ruby数组 – 与普通的C数组不同。

使用rb_ary_entry

VALUE rb_ary_entry(VALUE self, long index")

返回index处的数组self元素。

参考:

http://ruby-doc.org/docs/ProgrammingRuby/html/ext_ruby.html

请参阅“常用方法”下的常用arraysfunction列表。