簡體   English   中英

如何在C函數上使用SWIG獲取Ruby的輸出,該函數使用指向輸出參數的指針?

[英]How do I get outputs in Ruby using SWIG over a C function taking pointers to output arguments?

如何從Ruby中使用SWIG在C ++中編寫的函數中獲取輸出(使用int指針聲明)? 在下面的記錄中,我聲明一個“ a”和一個“ b”只是為了將它們初始化為整數,但實際上應該將它們作為輸出。

irb(main):001:0> require 'vetms.rb'
=> true
irb(main):002:0> a=3
=> 3
irb(main):003:0> b=4
=> 4
irb(main):004:0> $v.button a, b
ArgumentError: Wrong arguments for overloaded method 'BaseInterface.button'.
Possible C/C++ prototypes are:
bool BaseInterface.button(int *id, int *event)
bool BaseInterface.button(int *id)
bool BaseInterface.button()

    from (irb):4:in `button'
    from (irb):4
    from :0

(編輯)SWIG代碼並不出色-我確實使用了%include'pointers.i',但是我不確定這樣做會帶來什么。 'vetms.rb'只需要生成的庫並創建$ v對象。 我的主要問題是C ++函數,Ruby無法將我的'a'和'b'對象綁定到:

bool BaseInterface.button(int *id, int *event)

我的問題是,如果我在直接C語言中執行此操作,我會將地址“ a”和“ b”傳遞給函數,函數將設置內容-“ a”和“ b”是輸出變量。 所以我想調用“ $ v.button a,b”來做同樣的事情。 現在,我不確定通過引用或地址傳遞變量甚至不是Ruby中的概念,我只需要該調用的兩個輸出,而且我不知道如何實現它。

SWIG文檔建議您可以具有這樣的功能(在“ SWIG和Ruby”的第32.3.5節“指針”中):

Foo *get_foo();
void set_foo(Foo *foo);

但它們僅提供一個使用示例,作為返回值:

irb(main):001:0> foo = Example::get_foo()
#<SWIG::TYPE_p_Foo:0x402b1654>

在這種情況下,如何在Ruby中使用“ set_foo”?

我將研究FFI,但是有人知道如何使用SWIG嗎?

沒有SWIG / vetms.rb代碼,很難發表評論。 猜測您需要對Typemap做一些工作。

我建議使用FFI而不是SWIG來連接C代碼

https://github.com/ffi/ffi

更輕松,更好

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM