2011-02-23 5 views
0

Ruby에서 SWIG를 사용하여 C++로 작성한 함수에서 출력 (int 포인터를 사용하여 선언 됨)을 얻으려면 어떻게해야합니까? 아래의 성적표에서는 정수로 초기화되도록 'a'와 'b'를 선언하지만 실제로 출력물이라고 가정합니다.출력 인수에 대한 포인터를 취하는 C 함수를 통해 SWIG를 사용하여 루비에서 출력을 얻으려면 어떻게해야합니까?

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 

(편집)를 꿀꺽 꿀꺽 코드는 놀라운되지 않습니다 - 나는 퍼센트가 'pointers.i'을 포함하지만 난 그와 함께 무엇을 얻을 모르겠어요 사용합니까. 'vetms.rb'는 단순히 생성 된 라이브러리가 필요하며 $ v 객체를 만듭니다. 내가 바로 C에서이 일을한다면

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

내 문제는, 나는 통과 할 것입니다 : 여기 내 주요 문제는 루비 나의 'A'와 'B'개체를 바인딩 할 수 없습니다 내 C++ 기능을 함께 'a'와 'b'의 주소를 함수에 지정하면 함수가 내용을 설정합니다. 'a'와 'b'는 출력 변수입니다. 그래서 '$ v.button a, b'가 같은 것을하기를 바랍니다. 이제는 참조 또는 주소로 변수를 전달하는 것이 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"를 사용합니까?

FFI를 살펴 보겠지만 누구나 SWIG를 사용하는 방법을 알고 있습니까?

답변

0

SWIG/vetms.rb 코드 없이는 언급하기가 어렵습니다. typemaps로 작업해야 할 필요가 있습니다.

나는 당신의 C 코드

https://github.com/ffi/ffi

훨씬 쉽게에게 인터페이스 대신 꿀꺽 꿀꺽의 FFI을 사용하는 것이 좋습니다 것, 그리고

+0

더 좋은 나는 내 질문에 자세한 정보와 비트를 명확히. 감사! – Scott

+0

OK, 특정 답변을 찾았습니다. 매우 간단합니다. 이 줄을 .i 파일에 넣습니다. "% apply int * OUTPUT {int * id, int * event}". 이것은 분명히 SWIG에게 그 값을 반환하는 래퍼를 생성하도록 알려주므로 Ruby 라인은 이제 다음과 같이 보입니다 : "f, a, b = $ v.buttons", 여기서 f는 C++ 함수의 "bool" 'a'와 'b'는 출력 매개 변수입니다. 필자가 typemaps를 더 자세히 살펴 보았으므로 "정답"플래그를 사용하겠습니다. – Scott

+0

감사합니다. 기꺼이 도와 드리겠습니다. – macarthy

관련 문제