Как получить выходные данные в Ruby, используя SWIG через функцию C, использующую указатели для вывода аргументов? - PullRequest
0 голосов
/ 23 февраля 2011

Как получить выходные данные (объявленные с использованием указателей int) из функции, написанной на C ++, с использованием SWIG в Ruby?В приведенной ниже расшифровке я объявляю '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код не примечательный - я использую %, включая '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 and 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>

В этом случае, как использовать "set_foo" в Ruby?

Я посмотрю на FFI, но кто-нибудь знает, как это сделать с SWIG?

1 Ответ

0 голосов
/ 23 февраля 2011

Трудно комментировать без кода SWIG / vetms.rb.Полагаю, вам нужно поработать с картами типов.

Я бы предложил использовать FFI вместо SWIG для гораздо более простого взаимодействия с кодом C

https://github.com/ffi/ffi

, илучше

...