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 に押し込むよりもはるかに簡単です。私の知る限り、単一の関数をマップするための1回限りのハックを除いて、誰もDLを使用していません。FFI は Windows では動作しないとおっしゃいましたが、RubyInline ( http://www.zenspider.com/ZSS/Products/RubyInline/ ) を確認するか、単純な C 拡張機能を使用することをお勧めします (C を知っている場合)。 DL を使用するのに十分であり、拡張機能を作成するのに十分な C を知っている)

于 2008-11-19T12:39:49.070 に答える
0

FFIWindowsで動作するようになりました。

FFIC 関数から Ruby に変数を返す方法を示す Ruby での使用例を次に示します。

于 2013-01-06T14:16:02.810 に答える
-1

@msg はこの時点で初期化されていますか?

Gt4r.gTD_get_error_message rv, @msg

@msg が nil の場合、DL はおそらく null ポインターにキャストし、lib がそれを逆参照しようとするとクラッシュします。

于 2008-11-19T12:43:44.600 に答える