Comment accéder à un tableau ruby ​​à partir de mon extension c?

Je reçois cette erreur

ev.c:11: error: subscripted value is neither array nor pointer 

pour cette ligne

 printf("%d\n", pairs[0][0]); 

Dans ce code

 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_ssortingng("require './lib/ev/pair_counter'"); VALUE PairCounter = rb_path2class("EV::PairCounter"); rb_define_method(PairCounter, "sort_pairs_2", sort_pairs_2, 0); } 

Est-ce que j’utilise mal l’auto et rb_ivar_get ne pointe pas réellement vers la classe PairCounter?

Je suis presque sûr que vous devez utiliser la macro RARRAY_PTR sur des pairs pour accéder au tableau sous-jacent; Par exemple, l’implémentation interne de Array # push (pour 1.9.2) ressemble à ceci:

 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 seulement sortinge tout redimensionnement nécessaire, il existe alors RARRAY_PTR(ary)[idx] pour accéder à un seul emplacement de la masortingce.

Je n’ai aucune référence officielle à l’appui, mais j’espère que cela sera utile.

Les tableaux Ruby sont accessibles avec les fonctions rb_ – pas comme les tableaux C normaux.

Utilisez rb_ary_entry

VALUE rb_ary_entry(VALUE self, long index")

Renvoie self élément self tableau à l’ index .

Référence:

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

Voir une liste des fonctions de tableau courantes sous “Méthodes couramment utilisées” .