なかだです。

At Sun, 08 Apr 2007 13:35:28 +0900 (JST),
ysk wrote in [ruby-ext:02319]:
> VALUE型をヒープに確保した場合は
> rb_gc_markという関数でそのことをRuby側に
> 伝えてやる必要があるようです。

rb_gc_mark()をmark用関数以外から呼んではいけません。

この場合はresultを先に確保しておいて、そのptrを使うということで
いいのではないでしょうか。

static VALUE
si_calc6(self, ary1d, x0, y0, a)
    VALUE self;
    VALUE ary1d;
    VALUE x0;
    VALUE y0;
    VALUE a;
{
    unsigned int i;
    /* 引数をc言語の型に変換 */
    int x0c = NUM2INT(x0);
    int y0c = NUM2INT(y0);
    double ac = NUM2DBL(a);
    long length = RARRAY(ary1d)->len;
    VALUE result = rb_ary_new2(length);
    VALUE *items = RARRAY_PTR(result);
    VALUE klass = RBASIC(result)->klass;

    VALUE item;
    VALUE t;
    VALUE xt;
    double y;

    RBASIC(result)->klass = 0;
    for (i = 0; i < length; i++){
        t = INT2FIX(i + x0c);
        y = NUM2DBL(rb_ary_entry(ary1d, i));
        xt = rb_float_new(y0c - (y * ac));
        item = rb_ary_new3(2, t, xt);
        items[i] = item;
    }
    RBASIC(result)->klass = klass;

    return result;
}

-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦