2011-02-23 41 views
0

如何在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做到這一點?

回答

0

如果沒有SWIG/vetms.rb代碼,很難評論。猜測你需要使用類型映射做一些工作。

我建議使用FFI而不是痛飲接口C代碼

https://github.com/ffi/ffi

容易得多,而且更好

+0

我澄清我的問題有點更多的信息。謝謝! – Scott 2011-02-23 20:19:10

+0

好的,我找到了具體的答案,而且非常簡單。我把這一行放在我的.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

+0

謝謝,很高興我能幫你指點 – macarthy 2011-02-24 01:07:32