2009-09-30 8 views
1

J'ai une classe Publisher écrit en C++ avec les deux méthodes suivantes:Comment définir une typographie SWIG pour une référence au pointeur?

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

Liaisons Python pour cette classe sont générés en utilisant SWIG. Dans mon rasade fichier .i je donne les résultats suivants:

%pointer_class(double*, ptrDouble); 

Cela me permet de publier un champ qui est défini dans une variable Python:

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

Essayer d'utiliser les résultats de la méthode GetFieldReference dans un TypeError cependant :

GetFieldReference("value", newValue) 

Je pense que je dois créer un typemap pour le double * & qui retourne une ptrDouble, mais je ne suis pas tout à fait sûr de ce que cela ressemblerait.

Répondre

1

Voici une solution de travail que j'ai imaginée.

Ajoutez une fonction wrapper pour le fichier swig.i:

%inline %{ 
    double * GetReference(char* name, Publisher* publisher) 
    { 
     double* ptr = new double; 
     publisher->GetFieldReference(name, ptr); 
     return ptr; 
    } 
%} 

maintenant de Python que je peux utiliser ce qui suit:

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

Ce typemap devrait résoudre le problème -

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

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

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

Vous devrez peut-être vérifier si l'affectation de jarg2 (dans la typemap 'argout') avec la double valeur requise est correcte ou jarg1 shou Je vais être assigné plutôt.

Questions connexes