A
Aston
Hello,=0A=0AI am trying to learn ruby-ffi now (after sadly leaving dl libra=
ry), I have some trouble here too=0A=0AI will present a simple example wher=
e I want to pass a struct between ruby and C=0AI am facing problems while s=
etting fields of struct if that field is of type string(char*, not char[])=
=0AI understand we have to allocate the char* field of struct first than as=
sign some literal srting=0A=0Aconsider the C file=0A=0A********************=
** C FILE**********************=0A#include <stdlib.h>=0A#include <stdio.h>=
=0A#include <string.h>=0A=0Atypedef struct=0A{=0A char *name;=0A doub=
le val;=0A} INFO, *INFO_PTR;=0A=0AINFO_PTR create( char* name, double val)=
=0A{=0A INFO_PTR p =3D (INFO_PTR)malloc( sizeof(INFO));=0A p->val =3D=
val;=0A p->name =3D (char*)malloc( strlen(name) + 1);=0A strcpy( p->=
name, name);=0A return p;=0A}=0A=0Aint show( INFO_PTR pInfo)=0A{=0A r=
eturn printf( "%s - %f\n", pInfo->name, pInfo->val);=0A}=0A=0A*************=
********* END C FILE**********************=0A=0A********************** RUBY=
FILE**********************=0Arequire 'ffi'=0A=0Amodule LibTest=0A class I=
nfo < FFI::Struct=0A layout :name, :string,=0A :val, :double=
=0A end=0A=0A extend FFI::Library=0A ffi_lib "./libtest.so"=0A attach_f=
unction :create, [:string, :double], ointer=0A attach_function :show, [:=
pointer], :int=0Aend=0A=0Ainclude FFI=0A=0Aptr =3D LibTest.create( "test st=
ring", 11.27)=0Aobj =3D LibTest::Info.new(ptr)=0ALibTest.show(ptr)=0Aobj[:v=
al] =3D 27.11 # this works=0A# obj[:name] =3D "new string" # this gives err=
or, `[]=3D': Cannot set :string fields (ArgumentError)=0ALibTest.show(ptr)=
=0A********************** END RUBY FILE**********************=0A=0Ahow can =
I set string values from ruby ?=0AIf I refuse to declare name field as type=
char[] from char* then I have to allocate before I can assign=0Athen my ap=
proach below core dumps =0A=0A1 str =3D "test string"=0A2 p =3D MemoryPoi=
nter.new( str.size)=0A3 p.write_string(str)=0A4 puts p.read_string # "test =
string"=0A5 obj[:name].write_pointer(p) # core dumps here!=0A=0Aline # 5 co=
re dumps everytime one tries to write anything there, since pointer is inva=
lid I guess=0Ahow do I allocate memory there ? once allocated can i treat t=
hat allocated memory as ruby string ?=0A=0AGoal I want to achieve is I shal=
l allocate in ruby, assign in ruby and pass in to C code only for modificat=
ion or read only purpose=0Ahow do I go from here ? can you comment on this =
?=0A=0AAston=0A=0A=0A Cricket on your mind? Visit the ultimate cricket=
website. Enter http://beta.cricket.yahoo.com
ry), I have some trouble here too=0A=0AI will present a simple example wher=
e I want to pass a struct between ruby and C=0AI am facing problems while s=
etting fields of struct if that field is of type string(char*, not char[])=
=0AI understand we have to allocate the char* field of struct first than as=
sign some literal srting=0A=0Aconsider the C file=0A=0A********************=
** C FILE**********************=0A#include <stdlib.h>=0A#include <stdio.h>=
=0A#include <string.h>=0A=0Atypedef struct=0A{=0A char *name;=0A doub=
le val;=0A} INFO, *INFO_PTR;=0A=0AINFO_PTR create( char* name, double val)=
=0A{=0A INFO_PTR p =3D (INFO_PTR)malloc( sizeof(INFO));=0A p->val =3D=
val;=0A p->name =3D (char*)malloc( strlen(name) + 1);=0A strcpy( p->=
name, name);=0A return p;=0A}=0A=0Aint show( INFO_PTR pInfo)=0A{=0A r=
eturn printf( "%s - %f\n", pInfo->name, pInfo->val);=0A}=0A=0A*************=
********* END C FILE**********************=0A=0A********************** RUBY=
FILE**********************=0Arequire 'ffi'=0A=0Amodule LibTest=0A class I=
nfo < FFI::Struct=0A layout :name, :string,=0A :val, :double=
=0A end=0A=0A extend FFI::Library=0A ffi_lib "./libtest.so"=0A attach_f=
unction :create, [:string, :double], ointer=0A attach_function :show, [:=
pointer], :int=0Aend=0A=0Ainclude FFI=0A=0Aptr =3D LibTest.create( "test st=
ring", 11.27)=0Aobj =3D LibTest::Info.new(ptr)=0ALibTest.show(ptr)=0Aobj[:v=
al] =3D 27.11 # this works=0A# obj[:name] =3D "new string" # this gives err=
or, `[]=3D': Cannot set :string fields (ArgumentError)=0ALibTest.show(ptr)=
=0A********************** END RUBY FILE**********************=0A=0Ahow can =
I set string values from ruby ?=0AIf I refuse to declare name field as type=
char[] from char* then I have to allocate before I can assign=0Athen my ap=
proach below core dumps =0A=0A1 str =3D "test string"=0A2 p =3D MemoryPoi=
nter.new( str.size)=0A3 p.write_string(str)=0A4 puts p.read_string # "test =
string"=0A5 obj[:name].write_pointer(p) # core dumps here!=0A=0Aline # 5 co=
re dumps everytime one tries to write anything there, since pointer is inva=
lid I guess=0Ahow do I allocate memory there ? once allocated can i treat t=
hat allocated memory as ruby string ?=0A=0AGoal I want to achieve is I shal=
l allocate in ruby, assign in ruby and pass in to C code only for modificat=
ion or read only purpose=0Ahow do I go from here ? can you comment on this =
?=0A=0AAston=0A=0A=0A Cricket on your mind? Visit the ultimate cricket=
website. Enter http://beta.cricket.yahoo.com