【问题标题】:How do I access a ruby array from my c extension?如何从我的 c 扩展访问 ruby​​ 数组?
【发布时间】:2011-06-22 20:27:39
【问题描述】:

我收到了这个错误

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

【问题讨论】:

    标签: c ruby ruby-c-extension


    【解决方案1】:

    我很确定您需要在pairs 上使用RARRAY_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;
    }
    

    if 只是整理出任何必要的调整大小,然后有 RARRAY_PTR(ary)[idx] 用于访问数组中的单个插槽。

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

    【讨论】:

    • 感谢 mu,这段代码引导了我,让我朝着正确的方向前进。
    【解决方案2】:

    Ruby 数组使用 rb_ 函数访问 - 不像普通的 C 数组。

    使用rb_ary_entry

    VALUE rb_ary_entry(VALUE self, long index")

    返回数组selfindex处的元素。

    参考:

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

    查看“常用方法”下的常用数组函数列表

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      相关资源
      最近更新 更多