From: Colin Steele Date: 2001-04-12T05:47:59+09:00 Subject: [ruby-talk:13610] Data_Get_Struct wants a DATA... but I don't have one? I've got a headscratcher for y'all. I have a C extension which uses Data_Make_Struct, and then calls rb_obj_call_init. In my init function, I try to pull out my data pointer using Data_Get_Struct, but it pukes in rb_check_type, claiming I'm passing it the wrong type of data. This is almost identical to the example in the pickaxe book... what am I missing? Any help is greatly appreciated. Here's the output (the problem): colin@ska$ ruby extconf.rb creating Makefile colin@ska$ make gcc -fPIC -g -O2 -fPIC -I/usr/local/lib/ruby/1.6/i686-linux -I/usr/local/include -c -o foo.o foo.c gcc -shared -L/usr/local/lib/ruby/1.6/i686-linux -L/usr/local/lib -o foo.so foo.o -L. -lruby -lc colin@ska$ ruby ./test.rb ./test.rb:3:in `initialize': wrong argument type XXX::Process (expected Data) (TypeError) from ./test.rb:3:in `new' from ./test.rb:3 colin@ska$ ---------------------------------------------------------------------- Here's the ruby test: require "foo" foo = XXX::Process.new(42) ---------------------------------------------------------------------- Here's the C code: #include "ruby.h" VALUE mXXX; VALUE cProcess; struct _foo { int something; }; typedef struct _foo foo; VALUE process_init(VALUE self, VALUE pid) { foo *ptr; Data_Get_Struct(self, foo, ptr); return self; } VALUE process_new(VALUE class, VALUE thePID) { foo *ptr; VALUE tdata; tdata = Data_Make_Struct(class, foo, 0, 0, ptr); Data_Get_Struct(tdata, foo, ptr); return tdata; } void Init_foo() { mXXX = rb_define_module("XXX"); cProcess = rb_define_class_under(mXXX, "Process", rb_cObject); rb_define_method(cProcess, "initialize", process_init, 1); rb_define_method(cProcess, "new", process_new, 1); } -- Colin Steele colin@webg2.com / www.colinsteele.org / www.rubycookbook.org From "The Hacker's Dictionary": softy: [IBM] n. Hardware hackers' term for a software expert who is largely ignorant of the mysteries of hardware.