0

对先前问题的跟进,显示了当我尝试从目标库获取错误消息时失败的部分:

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:\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

显然,我遗漏了一些关于在 ruby​​ 和 C 之间传递参数的内容。我需要什么样的 ruby​​ 变量才能返回我的值?

4

3 回答 3

2

哪个位失败?我猜是这样的:

Gt4r.gTD_get_error_message rv, @msg

方法是如何实现的?该方法的 C 签名是什么?(*字符)?

顺便说一句:冒着听起来像破唱片的风险,写一个 C 扩展比试图把东西硬塞进 DL 要容易得多。AFAIK,没有人使用深度学习,除了可能一次性的黑客来映射单个功能。您提到 FFI 在 Windows 下不起作用,您可能想看看 RubyInline ( http://www.zenspider.com/ZSS/Products/RubyInline/ ),或者只使用普通的 C 扩展名(如果您知道 C足以使用 DL,您对 C 的了解足以编写扩展)

于 2008-11-19T12:39:49.070 回答
0

FFI现在可以在 Windows 上运行。

这是一个在 Ruby 中使用的示例FFI,展示了如何将 C 函数中的变量返回到 Ruby 中。

于 2013-01-06T14:16:02.810 回答
-1

@msg 此时是否已初始化:

Gt4r.gTD_get_error_message rv, @msg

如果 @msg 为 nil,DL 可能会将其转换为空指针,当您的 lib 尝试取消引用它时,该指针会崩溃。

于 2008-11-19T12:43:44.600 回答