Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从我的c扩展访问ruby数组?_C_Ruby_Ruby C Extension - Fatal编程技术网

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

如何从我的c扩展访问ruby数组?,c,ruby,ruby-c-extension,C,Ruby,Ruby C Extension,我犯了这个错误 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_in

我犯了这个错误

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

我很确定您需要使用
pairs上的
RARRAY\u PTR
宏来获取底层数组;例如,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;
}
如果
只是对任何必要的大小调整进行排序,那么就有
RARRAY_PTR(ari)[idx]
用于访问阵列中的单个插槽


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

Ruby数组是通过rb_uu函数访问的,不像普通的C数组

使用
rb\u ary\u条目

VALUE-rb\u-ary\u条目(值自身,长索引”)

返回
索引处的数组
self
元素

参考资料:


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

谢谢mu,这段代码面向我,让我朝着正确的方向前进。