簡體   English   中英

如何從c擴展名訪問ruby數組?

[英]How do I access a ruby array from my 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_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_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]訪問數組中的單個插槽。

我沒有任何官方參考來支持此操作,但希望這會有所幫助。

Ruby數組是使用rb_函數訪問的-與普通的C數組不同。

使用rb_ary_entry

VALUE rb_ary_entry(VALUE self, long index")

index處返回數組self的元素。

參考:

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

請參閱“常用方法”下的常見數組函數列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM