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를 사용하는 방법을 알고 있습니까?
더 좋은 나는 내 질문에 자세한 정보와 비트를 명확히. 감사! – Scott
OK, 특정 답변을 찾았습니다. 매우 간단합니다. 이 줄을 .i 파일에 넣습니다. "% apply int * OUTPUT {int * id, int * event}". 이것은 분명히 SWIG에게 그 값을 반환하는 래퍼를 생성하도록 알려주므로 Ruby 라인은 이제 다음과 같이 보입니다 : "f, a, b = $ v.buttons", 여기서 f는 C++ 함수의 "bool" 'a'와 'b'는 출력 매개 변수입니다. 필자가 typemaps를 더 자세히 살펴 보았으므로 "정답"플래그를 사용하겠습니다. – Scott
감사합니다. 기꺼이 도와 드리겠습니다. – macarthy