How do you return a variable in a C interface & # 8594; ruby?
A follow up on an earlier question showing the part that fails when I try to get an error from my target library:
require 'gt4r'
@@test_environment = "INCLUDE=C:\\graphtalk\\env\\aiadev\\config\\aiadev.ini"
@@normal_user = "BMCHARGUE"
describe Gt4r do
it 'initializes' do
rv = Gt4r.gTD_initialize @@normal_user, @@normal_user, @@test_environment
Gt4r.gTD_get_error_message rv, @msg
@msg.should == ""
rv.should == 0
end
end
I expect the error message to be returned in @msg, but when I run I get this:
Gt4r
(eval):5: [BUG] Segmentation fault
ruby 1.8.6 (2008-08-11) [i386-mswin32]
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application support team for more information.
And if I use the (: msg) symbol instead:
C:\code\GraphTalk\gt4r_dl>spec -fs -rgt4r gt4r_spec.rb
Gt4r
- initializes (ERROR - 1)
1)
NoMethodError in 'Gt4r initializes'
undefined method `to_ptr' for :msg:Symbol
(eval):5:in `call'
(eval):5:in `gTD_get_error_message'
./gt4r_spec.rb:9:
Finished in 0.046 seconds
1 example, 1 failure
Clearly I am missing something about passing parameters between ruby and C. What ruby variable do I need to return my value?
source to share
What bit is failing? I guess this is:
Gt4r.gTD_get_error_message rv, @msg
How is the method implemented? What is C Method Signature? (* char)?
Btw: at the risk of sounding like a broken record, it's much easier to write a C extension than trying to teach DL stuff. AFAIK, nobody uses DL, other than perhaps one-off hacks to expose individual functions. You mentioned that FFI doesn't work under Windows, you can take a look at RubyInline ( http://www.zenspider.com/ZSS/Products/RubyInline/ ) or just use plain C (if you know C enough to use DL, you know C well enough to write an extension)
source to share