2011-06-22 70 views
2

我得到这个错误如何从我的c扩展中访问红宝石数组?

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类?

回答

2

我敢肯定,您需要使用上的RARRAY_PTR宏来获取底层数组;例如,内部实行阵列#推(对于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]用于存取所述阵列中的一个插槽。

我没有任何官方的参考来支持这个,但希望这将有一定的用处。

+0

感谢mu,这段代码使我朝着正确的方向前进。 –