From: EMOTO Masahiko Date: 2003-06-05T13:06:46+09:00 Subject: [ruby-list:37755] Re: rb_ary_push 教えていただいた方法を試してみましたが、 別のところで落ちてしまいました。 やはりガベージコレクタ関連のようです。 >Program received signal SIGSEGV, Segmentation fault. >mark_locations_array (x=0x80b77cd, n=-302548858) at gc.c:353 >353 { >Current language: auto; currently c 別の方法(なるべくオブジェクトを生成しないようにする) でインプリメントしてみます。                       江本 At Wed, 4 Jun 2003 22:13:51 +0900, nobu.nakada@nifty.ne.jp wrote: > > なかだです。 > > At Wed, 4 Jun 2003 20:22:32 +0900, > EMOTO Masahiko wrote: > > プログラム中で配列の大きさ(サンプルではN、M)が小さい時は > > 動作するのですが、大きくすると落ちてしまいます。 > > スタック上のGCから保護される範囲から、aryとary2が外れているのだ > と思います。 > > 実際のコードや最適化の具合によって条件は変わりますが、一般的に > ruby_init()を呼ぶ関数と同じかそれよりも(コールグラフで)上の関数 > では、VALUEを使うのは危険です。rb_ary_new()以降を別関数に分ける > とうまくいくかも知れません。 > > あるいは、Init_stack()をより上位のアドレスで呼び出すとか。 > > int > main(int argc, char **argv) > { > int i,j; > VALUE ary,ary2; > ruby_init(); > Init_stack((VALUE*)&argc); /* <---- ここ */ > ruby_init_loadpath(); > ary = rb_ary_new(); > for(i=0;i ary2 = rb_ary_new(); > for(j=0;j rb_ary_push(ary2,rb_float_new((double )i)); > rb_ary_push(ary,ary2); > } > } > } > > -- > --- 僕の前にBugはない。 > --- 僕の後ろにBugはできる。 > 中田 伸悦 >