如何使用SWIG通过C函数获取Ruby中的输出,并获取输出参数的指针?

时间:2011-02-23 17:59:53

标签: c++ ruby swig

如何从我在C ++中使用SWIG编写的函数中获取输出(使用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'spotersters.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做到这一点吗?

1 个答案:

答案 0 :(得分:0)

没有SWIG / vetms.rb代码很难发表评论。猜猜你需要用类型图做一些工作。

我建议使用FFI而不是SWIG来连接您的C代码

https://github.com/ffi/ffi

更容易,更好