2

このエラーが発生しています

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 クラスを指していませんか?

4

2 に答える 2

3

基になる配列を取得するには、RARRAY_PTRマクロ onを使用する必要があると確信しています。pairsたとえば、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]にアクセスできます。

これを裏付ける公式のリファレンスはありませんが、うまくいけば、これは何らかの役に立つでしょう.

于 2011-06-22T20:52:31.640 に答える
1

Ruby 配列は、通常の C 配列とは異なり、rb_ 関数でアクセスされます。

使用するrb_ary_entry

VALUE rb_ary_entry(VALUE self, long index")

selfにある配列の要素を返しますindex

参照:

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

「一般的に使用されるメソッド」の下にある一般的な配列関数のリストを参照してください。

于 2012-03-08T14:25:46.513 に答える