2011-06-22 108 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,這段代碼使我朝着正確的方向前進。 –