Ernest Ellingson wrote: > I'm trying to do something real simple find the sin of an angle in an > extension. I'm sure you'll recognize the following code as a variation > of the example in Pick Axe 2. I've read README.EXT. Looked at Math.c > been all over the web and I can't seem to figure out the correct way to > do this. Can someone give me a clue? > > Ernie > #include "ruby.h" > static int id_push; This should be (int won't work on most/all 64 bit systems): static ID id_push; > static VALUE t_init(VALUE self) > { > VALUE arr; > arr=rb_ary_new(); > rb_iv_set(self, "@arr", arr); > return self; > } > static VALUE t_add(VALUE self, VALUE obj) > { > VALUE arr; > VALUE si; > arr=rb_iv_get(self, "@arr"); > si=sin(obj); Read the man page for sin. Basically obj is a reference to a Ruby Object not a double, so you need to go from a Ruby object to a double here. Best way is obj = rb_Float(obj); - or - obj = rb_convert_type(obj, T_FLOAT, "Float", "to_f"); then you can get treat obj as a T_FLOAT and cast it to a struct RFloat* and get the value like so: double sin_of_obj = sin(RFLOAT(obj)->value); Finally you can create a new float from the result of sin() using rb_float_new(sin_of_obj). > rb_funcall(arr, id_push,1,si); > return arr; > } > > VALUE cTest; > void Init_junk() > { > cTest=rb_define_class("Junk", rb_cObject); > rb_define_method(cTest, "initialize",t_init,0); > rb_define_method(cTest, "add", t_add,1); > Init_Math(); > id_push = rb_intern("push"); > } > after compiling > > require 'junk' > a=Junk.new > a.add(0.75) > puts a => false; I think all of the errors in your code would be caught be compiler warnings, perhaps use -Wall / -W. -Charlie