2009-09-30 4 views
1

다음 두 가지 방법으로 C++로 작성된 Publisher 클래스가 있습니다.포인터에 대한 참조를 위해 SWIG typemap을 정의하는 방법은 무엇입니까?

PublishField(char* name, double* address); 
GetFieldReference(char* name, double*& address); 

이 클래스의 파이썬 바인딩은 SWIG를 사용하여 생성됩니다.

 %pointer_class(double*, ptrDouble); 

이렇게하면 Python 변수에 정의 된 필드를 게시 할 수 있습니다.

value = ptrDouble() 
value.assign(10.0) 
PublishField("value", value.cast()) 

그러나 GetFieldReference 메서드를 사용하면 TypeError가 발생하지만 :

GetFieldReference("value", newValue) 

필자는 ptrDouble을 반환하는 double * &에 대한 typemap을 만들 필요가 있다고 생각하지만 실제로 어떻게 될지 확실하지 않습니다.

답변

1

다음은 내가 생각해 낸 해결 방법입니다.

swig.i 파일에 래퍼 함수를 ​​추가

파이썬에서 이제
%inline %{ 
    double * GetReference(char* name, Publisher* publisher) 
    { 
     double* ptr = new double; 
     publisher->GetFieldReference(name, ptr); 
     return ptr; 
    } 
%} 

나는 다음을 사용할 수 있습니다

value = ptrDouble.frompointer(GetFieldReference("value", publisher) 
0

문제를 해결해야이 타입 맵 -

// Typemaps for double *& 
%typemap(in) double *& (double *ppDouble = NULL) %{ 
$1 = &ppDouble ; 
%} 

%typemap(argout) double *& { 
*(double **)&jarg2 = *$1; 
} 

%typemap(javain) double *& "$javainput" 

필요한 double 값을 가진 jarg2 ('argout'형식의)를 올바르게 지정했는지 확인하거나 jarg1 shou 오히려 할당됩니다.

관련 문제