小林です。

Ruby本450頁以降のrb_obj_call_init()の引数が実際と異
なるようですが?
ま、やれば分かるので問題はないです。

今、みようみまねで拡張ライブラリの作成に挑戦してい
るのですが、以下のようにうまく行きません。

やりたいことは、あるクラス(仮にTEST)を作り、それ
の加算をやりたいのです。
  a = TEST::new
  b = TEST::new
  c = a+b  # cはa,bと同じクラスのインスタンス(新規)

そこで、
TEST_Init()に以下のように定義しました。
    cTEST = rb_define_class("TEST", rb_cObject);
    rb_define_singleton_method(cTEST, "new", TEST_new, 2);
    rb_define_method(cTEST,"+",TEST_add,1);

さらに、TEST_add()では
  ...............
    obj = rb_obj_alloc(cTEST);
    rb_obj_call_init(obj,0,0);
    v = malloc(......);
   obj = Data_Wrap_Struct(obj,0,TEST_delete,v);
  return obj;

とするとrubymw.dll(WinNTでやっています)のst.cの216行目で
アクセス違反になります。st_lookup(table, key, value)内で、
    hash_val = do_hash(key, table);
を実行しますが、このときのtableが未定義なのでアクセス違反
になります。
因みに、
    pv = malloc(......);
   obj = Data_Wrap_Struct(obj,0,TEST_delete,pv);
の2行をコメントにするとOKです(取りあえず死なないという意味
です)。

a+bの結果としてcを新たに、独自構造体を付加して、生成したい
のですが、やり方を教えていただけますでしょうか。
上記の2行はTEST_new()メソッドでも同じように割り当てています
がこちらはOKなので、obj = rb_obj_alloc(cTEST)あたりの使い方
が悪いとは思っているのですが?

小林 茂雄
E-Mail: shigeo / tinyforest.gr.jp
Home Page: http://www.tinyforest.gr.jp