2009-08-08 2 views
1

여러 변수 인수를 하나의 입력 매개 변수로 변환하는 typemap을 작성하려고합니다.여러 개의 인수를 하나의 SWIG 매개 변수로 축소하는 방법

예를 들어 벡터를 사용하는 함수가 있다고 가정 해 보겠습니다.

void foo(vector<int> x); 

내가 같이 호출 할

foo(1,2,3,4); 

는 타입 맵은, ($의 argnum, ...) 인수를 하나 개의 벡터로 수집하고한다 (Perl로 될 일이) 그걸 foo에게 넘겨 줘.

지금까지이 있습니다

void foo(vectori, ...); 

꿀꺽 꿀꺽 예상됩니다

if ((items < 1) || (items > 1)) { 
    SWIG_croak("Usage: foo(vectori);"); 
} 

내가 할 경우 그 꿀꺽 꿀꺽 인수의 수를 확인 제외하고이 작동 할

typedef vector<int> vectori; 
%typemap(in) (vectori) { 
    for (int i=$argnum-1; i<items; i++) { 
     $1->push_back(<argv i>); // This is language dependent, of course. 
    } 
} 

두 개의 인수로 foo를 호출합니다.

foo(arg1, arg2); 

아마 SWIG가 foo를 호출하여 arg2를 억제하도록 말할 수 있습니까?

내 .I이 사용할 수 없습니다 :

void foo(...) 

을 내가 기대 foo는 유형 (INT, 문자열 배열을, 무엇이든)에 따라 다른적인 typemap을 갖고 싶어하기 때문이다. 어쩌면 유형을 줄 수있는 방법이 "..."

이 방법이 있습니까?

답변

0

SWIG는 SWIG가 바인딩을 생성 할 때 인수 개수를 결정합니다. SWIG는 다양한 인수 목록에 대해 제한된 지원을 제공하지만 이것이 올바른 접근 방식인지는 확실하지 않습니다. 관심이 있으시면 SWIG vararg 문서 섹션에서 자세한 내용을 확인할 수 있습니다.

더 나은 방법은 배열 참조로이 값을 전달하는 것입니다. 당신의 타입 맵은 (하지 않음 시험)과 같이 보일 것입니다 :

%typemap(in) vectori (vector<int> tmp) 
{ 
    if (!SvROK($input)) 
     croak("Argument $argnum is not a reference."); 

    if (SvTYPE(SvRV($input)) != SVt_PVAV) 
     croak("Argument $argnum is not an array."); 

    $1 = &$tmp; 

    AV *arrayValue = (AV*)SvRV($input); 
    int arrayLen = av_len(arrayLen); 

    for (int i=0; i<=arrayLen; ++i) 
    { 
     SV* scalarValue = av_fetch(arrayValue , i, 0); 
     $1->push_back(SvPV(*scalarValue, PL_na)); 
    } 
}; 

그런 다음 펄에서 당신이 배열 표기법을 사용하십시오 :

@myarray = (1, 2, 3, 4); 
foo(\@myarray); 
1

꿀꺽 꿀꺽가 내장 된 일부 STL 클래스에 대한 지원. 그런 다음

%module mymod 

%{ 
#include <vector> 
#include <string> 
void foo_int(std::vector<int> i); 
void foo_str(std::vector<std::string> i); 
%} 

%include <std_vector.i> 
%include <std_string.i> 
// Declare each template used so SWIG exports an interface. 
%template(vector_int) std::vector<int>; 
%template(vector_str) std::vector<std::string>; 

void foo_int(std::vector<int> i); 
void foo_str(std::vector<std::string> i); 

를 선택한 언어로 배열 구문을 호출 : 당신 꿀꺽 꿀꺽 .I 파일이 시도

#Python 
import mymod 
mymod.foo_int([1,2,3,4]) 
mymod.foo_str(['abc','def','ghi']) 
관련 문제