0
arr=Array.new(3)
arr[0]=5
arr[1]=3
arr[2]=2

これらの行は、この関数を呼び出す必要があります。これによれば、 https://github.com/ruby/ruby/blob/trunk/array.c#L568、http ://www.ruby-doc.org/core-1.9.3/ Array.html

そこで、配列の値を表示するために数行追加しました。しかし、期待した結果が得られませんでした。

else {
    memfill(RARRAY_PTR(ary), len, val);
    ARY_SET_LEN(ary, len);
    int i;
    int result;
    result = 0;
    VALUE *s_arr = RARRAY_PTR(ary);
    for(i = 0; i < len; i++) {
        result = LONG2NUM(s_arr[i]);
        printf("r: %d\n",result);
    }
}

次のような結果が得られました。

arr=Array.new(3)
arr[0]=5
arr[1]=3
arr[2]=2
r: 9
r: 9
r: 9

なぜこの結果なのですか?なぜ9?

私はそれを解決するためにこれらに従いました:

誰かがCでRuby配列の値を表示/印刷するのを手伝ってもらえますか?

4

1 に答える 1

0

これは意味がありません:

result = LONG2NUM(s_arr[i]);

LONG2NUMCを数値を保持するlong intRubyに変換するために使用されます。はすでにそうなので、あなたは効果的に次のようなことをしています。これのラッパーとしてで定義されています:VALUEs_arr[i]VALUEVALUE v = LONG2NUM((VALUE)5)LONG2NUMruby.h

#define LONG2NUM_internal(v) (FIXABLE(v) ? LONG2FIX(v) : rb_int2big(v))

そして、それをbignumに変換せずにv収まる場合は、これを使用することになります。VALUE

#define INT2FIX(i) ((VALUE)(((SIGNED_VALUE)(i))<<1 | FIXNUM_FLAG))

つまり、基本的には、ポインタに対してたくさんのビットラングリングを行っていて、なぜそれが常に表示されるのか疑問に思っています9セグメンテーション違反とは言えないので、自分は幸運(または不幸)だと考えてください。

VALUE数値を保持するaをC整数に変換したいとします。あなたはおそらく使いたいでしょうFIX2LONG

#define FIX2LONG(x) (long)RSHIFT((SIGNED_VALUE)(x),1)

またはNUM2LONG

#define NUM2LONG_internal(x) ((long)(FIXNUM_P(x) ? FIX2LONG(x) : rb_num2long(x)))
#ifdef __GNUC__
#define NUM2LONG(x) \
    __extension__ ({VALUE num2long_x = (x); NUM2LONG_internal(num2long_x);})
#else
static inline long
NUM2LONG(VALUE x)
{
    return NUM2LONG_internal(x);
}
#endif

だからこのようなもの:

long result;
for(i = 0; i < len; i++) {
    result = NUM2LONG(s_arr[i]);
    printf("r: %ld\n", result);
}

%ld現在sを使用しているため、への切り替えに注意してください。フォーマットと引数のlong不一致について文句を言う厄介なコンパイラフラグを常にオンにします。printfもちろん、これは、配列にCに収まる数が含まれていることが確実であることを前提としていますlong

于 2012-06-22T22:28:40.637 に答える