From: Simon Strandgaard <0bz63fz3m1qt3001@...> Date: 2003-06-24T16:03:29+09:00 Subject: Re: collect info about ruby-api On Mon, 23 Jun 2003 21:44:52 +0000, Shashank Date wrote: > > "Shashank Date" wrote in message >> I am still trying to figure out how to convert it into >> a fully working C program (like all the other code examples). Sorry.. I couldn't think of any good cutnpaste-example when I wrote the text about rb_class_new_instance(). If anyone has ideas for better examples they are welcome. > To be more specific, I am on WIN XP Pro, using VC++ 6.0 > The following code does not work (it crashes and asks me if I > want to send the error report to Microsoft. Probably because I > do not know how "... to tell the Ruby's garbage collector that > there is a new instance in town" ) There is 2 ways you can inform GC about the new instance. #1 rb_define_variable(name, instance); by naming the instance, so it can be accessed by its Ruby-variable-name. Use this if you want to share an instance between Ruby and you extension/embedding code. #2 rb_gc_register_address(&instance); don't want to assign a name to the instance. Use this if you want to keep some variables *private* to your extension/embedding code. It cannot be accessed from a ruby-script. > I have tested all the other programs and they all work fine so I don't > think there is a problem with setting up my VisualStudio 6.0 environment. OK.. nice to know. I was worried that it wouldn't work on windows. Perhaps you can add a short guide to rubygarden about how you have setup'ed compilation on windows ? > //------------------------------------------------------------------- > #include > int main(int Argc, char **Argv) { > > int argc; > VALUE argv[2]; > VALUE class; > VALUE instance; > > ruby_init(); > > argv[0] = INT2FIX(42); > argv[1] = rb_str_new2("hello world"); > argc = 2; > > /* ----- This does not work either: > class = rb_path2class("TestClass"); > instance = rb_class_new_instance(argc, argv, class); > */ > > class = rb_const_get(rb_cObject, rb_intern("TestClass")); ^^^^^^^^^ 'TestClass' does not exist.. Try with a class-name which exists, perhaps: String, Array, .. Besides that you code looks ok :-) > instance = rb_funcall2(class, rb_intern("new"), argc, argv); > ruby_finalize(); > return 0; > > } > > //------------------------------------------------------------------- #include int main(int argc, char *argv[]) { int n; VALUE args[2]; VALUE klass; VALUE instance; ruby_init(); args[0] = INT2FIX(4); args[1] = rb_str_new2("ok"); n = 2; klass = rb_path2class("Array"); instance = rb_class_new_instance(n, args, klass); /* tell GC that there is a new instance in town. */ rb_gc_register_address(&instance); rb_p(instance); ruby_finalize(); return 0; } > ./a.out ["ok", "ok", "ok", "ok"] -- Simon Strandgaard