如何在Ruby中使用SWIG在C++中編寫的函數中獲取輸出(使用int指針進行聲明)?在下面的記錄中,我聲明一個'a'和'b'只是爲了讓它們初始化爲整數,但實際上它們應該是輸出。如何在使用SWIG的Ruby上使用指向輸出參數的C函數獲取輸出?
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碼不顯着 - 我使用%包括「pointers.i」,但我不知道我得到這一點。 'vetms.rb'只需要生成的庫並創建一個$ v對象。我這裏主要的問題是我的C++功能,紅寶石不能結合我的「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做到這一點?
我澄清我的問題有點更多的信息。謝謝! – Scott 2011-02-23 20:19:10
好的,我找到了具體的答案,而且非常簡單。我把這一行放在我的.i文件中:「%apply int * OUTPUT {int * id,int * event}」。這顯然告訴SWIG生成一個返回這些值的包裝器,所以Ruby線現在看起來像這樣:「f,a,b = $ v.buttons」,其中f現在是C++函數的「bool」返回值, 'a'和'b'是輸出參數。因爲您建議我仔細查看類型映射,所以我會給您「正確答案」標誌。 – Scott 2011-02-23 23:12:24
謝謝,很高興我能幫你指點 – macarthy 2011-02-24 01:07:32