我收到此错误
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类?
答案 0 :(得分:3)
我很确定你需要使用RARRAY_PTR
上的pairs
宏来获取底层数组;例如,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]
用于访问数组中的单个插槽。
我没有任何官方参考支持这一点,但希望这会有所帮助。
答案 1 :(得分:1)
使用rb_函数访问Ruby数组 - 与普通的C数组不同。
使用rb_ary_entry
VALUE rb_ary_entry(VALUE self, long index")
在
self
返回数组index
的元素。
<强>参考:强>
http://ruby-doc.org/docs/ProgrammingRuby/html/ext_ruby.html
请参阅“常用方法”下的常用数组函数列表。