2016-10-15 2 views
0

J'utilise le code suivantcomment passer des valeurs ENUM à partir du script TCL à la classe C++ en utilisant SWIG

1) Fichier: example.i

%module example 
%{ 
     /* Put header files here or function declarations like below */ 
     #include "example.h" 
%} 

%include "example.h" 

2) Fichier example.h

enum Type {one,two}; 
class myClass { 
    public: 
     myClass() {} 
     static bool printVal(int val); 
     static bool printEnum(Type val); 
}; 

3) fichier example.cpp

#include "example.h" 
#include <iostream> 
using namespace std; 

bool myClass::printVal(int val) { 
    cout << " Int Val = " << val << endl; 
    return 0; 
} 
bool myClass::printEnum(type val) { 
    cout << " Enum Val = " << val << endl; 
    return 0; 
} 

étapes pour compiler et exécuter

swig -c++ -tcl example.i 
g++ -c -fpic example_wrap.cxx example.cpp -I/usr/local/include 
g++ -shared example.o example_wrap.o -o example.so 
setenv LD_LIBRARY_PATH /pathtoexample.so:$LD_LIBRARY_PATH 
tclsh 
% load example.so 
%myClass_printVal 1 
    Int Val = 1 
%myClass_printEnum one 
TypeError in method 'myClass_printEnum', argument 1 of type 'type' 

Je reçois TypeError si je passe enum. Je sais qu'il existe une typemap pour la conversion de type, mais je ne sais pas comment utiliser typemaps pour passer des valeurs enum du script TCL à la classe C++. J'attends de l'aide pour savoir comment transmettre des valeurs enum de TCL à des objets de classe C++ en utilisant SWIG.

Répondre

0

Selon le official documentation:

C/C constantes de sont installées comme des variables globales Tcl contenant la valeur appropriée.

donc vous devez vous référer à la valeur ENUM par déréférencement la variable correspondante:

% myClass_printEnum $one 

Quelques exemples d'exposition C/C++ énumérations en Tcl sont un disponible à http://doc.gnu-darwin.org/enum/

+0

J'ai essayé la même chose et ça ne marche pas . J'ai essayé de mettre un "un"; myClass_printEnum $ un. Je reçois la même erreur TypeError dans la méthode 'myClass_printEnum', l'argument 1 de type 'type' – TechEnthusiast

+0

La variable globale 'one' est déjà définie par' example.so'. Ne le mets pas toi-même. – Leon

+0

est-il possible de définir enum Type dans la classe myClass et le passer de TCL par exemple class myClass { public: – TechEnthusiast