You probably want to take this to the ruby-ffi project here: http://kenai.com/projects/ruby-ffi Aston wrote: > Hello, > > I am trying to learn ruby-ffi now (after sadly leaving dl library), I > have some trouble here too > > I will present a simple example where I want to pass a struct between > ruby and C > I am facing problems while setting fields of struct if that field is of > type string(char*, not char[]) > I understand we have to allocate the char* field of struct first than > assign some literal srting > > consider the C file > > ********************** C FILE********************** > #include <stdlib.h> > #include <stdio.h> > #include <string.h> > > typedef struct > { > char *name; > double val; > } INFO, *INFO_PTR; > > INFO_PTR create( char* name, double val) > { > INFO_PTR p = (INFO_PTR)malloc( sizeof(INFO)); > p->val = val; > p->name = (char*)malloc( strlen(name) + 1); > strcpy( p->name, name); > return p; > } > > int show( INFO_PTR pInfo) > { > return printf( "%s - %f\n", pInfo->name, pInfo->val); > } > > ********************** END C FILE********************** > > ********************** RUBY FILE********************** > require 'ffi' > > module LibTest > class Info < FFI::Struct > layout :name, :string, > :val, :double > end > > extend FFI::Library > ffi_lib "./libtest.so" > attach_function :create, [:string, :double], :pointer > attach_function :show, [:pointer], :int > end > > include FFI > > ptr = LibTest.create( "test string", 11.27) > obj = LibTest::Info.new(ptr) > LibTest.show(ptr) > obj[:val] = 27.11 # this works > # obj[:name] = "new string" # this gives error, `[]=': Cannot set > :string fields (ArgumentError) > LibTest.show(ptr) > ********************** END RUBY FILE********************** > > how can I set string values from ruby ? > If I refuse to declare name field as type char[] from char* then I have > to allocate before I can assign > then my approach below core dumps :( > > 1 str = "test string" > 2 p = MemoryPointer.new( str.size) > 3 p.write_string(str) > 4 puts p.read_string # "test string" > 5 obj[:name].write_pointer(p) # core dumps here! > > line # 5 core dumps everytime one tries to write anything there, since > pointer is invalid I guess > how do I allocate memory there ? once allocated can i treat that > allocated memory as ruby string ? > > Goal I want to achieve is I shall allocate in ruby, assign in ruby and > pass in to C code only for modification or read only purpose > how do I go from here ? can you comment on this ? > > Aston > > > ------------------------------------------------------------------------ > Now surf faster and smarter ! Check out the new Firefox 3 - Yahoo! > Edition * Click here! > <http://in.rd.yahoo.com/tagline_firefox_1/*http://downloads.yahoo.com/in/firefox/?fr=om_email_firefox>