Как вы возвращаете переменную в интерфейсе C -> ruby?

Следуйте более раннему вопросу, показывая часть, которая терпит неудачу, когда я пытаюсь получить сообщение об ошибке из моей целевой библиотеки:

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

Я ожидаю, что сообщение об ошибке будет возвращено в @msg, но при запуске я получаю следующее:

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's support team for more information.

И это, если я вместо этого использую символ (: msg):

C:codeGraphTalkgt4r_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

Ясно, что я пропускаю что-то о передаче параметров между ruby ??и C. Какую рубиновую переменную мне нужно, чтобы вернуть мое значение?

c,ruby,interface,ffi,rubydl,

0

Ответов: 3


2

Какой бит терпит неудачу? Я предполагаю, что это так:

Gt4r.gTD_get_error_message rv, @msg

Как реализуется этот метод? Что такое C-подпись метода? (* Символ)?

Btw: рискуя звучать как сломанная запись, намного проще написать расширение C, чем пытаться обучать вещи DL. AFAIK, никто не использует DL, кроме, возможно, одноразовых хаков, чтобы отображать отдельные функции. Вы упомянули, что FFI не работает под Windows, вы можете взглянуть на RubyInline ( http://www.zenspider.com/ZSS/Products/RubyInline/ ) или просто использовать простое расширение C (если вы знаете C достаточно хорошо, чтобы использовать DL, вы знаете C достаточно хорошо, чтобы написать расширение)


0

FFI теперь работает в Windows.

Вот пример использования FFIв Ruby, который показывает, как вернуть переменную из функции C в Ruby.


-1

На этом этапе инициализируется @msg:

Gt4r.gTD_get_error_message rv, @msg

Если @msg равно nil, DL, вероятно, передаст его нулевому указателю, который выйдет из строя, когда ваш lib попытается разыменовать его.

с, рубин, интерфейс, FFI, rubydl,
Похожие вопросы