2

我收到此错误

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);
}

我是否错误地使用了 self,而 rb_ivar_get 实际上并没有指向 PairCounter 类?

4

2 回答 2

3

我很确定您需要使用RARRAY_PTRpairs来获取底层数组;例如,Array#push(对于 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]访问数组中的单个插槽。

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

于 2011-06-22T20:52:31.640 回答
1

Ruby 数组是通过 rb_ 函数访问的——不像普通的 C 数组。

采用rb_ary_entry

VALUE rb_ary_entry(VALUE self, long index")

在 处返回数组self的元素index

参考:

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

请参阅“常用方法”下的常用数组函数列表。

于 2012-03-08T14:25:46.513 回答