|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre du Club
![]() Inscription : décembre 2002 Messages : 151 ![]() |
Bonjour,
Je suis en train de faire quelques tests avec Swig et je bute sur un problème. Je cherche à faire l'interfaçage entre une librairie C++ et du Tcl. J'ai une méthode C++ à qui normalement on passe en argument un pointeur sur un buffer (alloué préalablement) et qui le rempli avec une chaine de caractère. Cette méthode me retourne le nombre de caractère qu'elle a placé dans le buffer. Je cherche donc à l'appeler depuis le TCL. Ce qui me bloque c'est de passer le nom de la variable (pointeur sur le buffer) à la DLL et qu'elle me le remplisse. En résumé, on a la déclaration de la méthode C++ : int Test::remplir(char* buffer, int lengthMax); En TCL on écrirait : Test monNouvelObjet monNouvelObjet remplir maVariable 50 ::puts $maVariable et donc "maVariable" contiendrait par exemple "hello world from DLL" Ce que j'ai réussi à faire c'est de passer en argument à une fonction C une chaine de caractère et que la DLL me la modifie. Or il faudrait que la chaine de caractère soit considérée comme un nom de variable. Merci d'avance ! |
|
|
00
|
|
|
#2 | |
|
Expert Confirmé Sénior
![]() Inscription : juin 2008 Messages : 3 693 ![]() |
Salut,
Citation:
Si vous cherchez dans la documentation "embedding TCL", l'assignation d'une (nom de) variable à un littéral se fait via la fonction "char *Tcl_SetVar" de l'API. Enfin, désolé si je n'ai rien compris! - W
__________________
Architectures Post-Modernes |
|
|
|
00
|
|
|
#3 |
|
Membre du Club
![]() Inscription : décembre 2002 Messages : 151 ![]() |
Effectivement ça pourrait être une piste à creuser, mais je ne vois pas trop comment l'utiliser avec Swig
|
|
|
00
|
|
|
#4 | |
|
Expert Confirmé Sénior
![]() Inscription : juin 2008 Messages : 3 693 ![]() |
Salut,
Citation:
Si le code C doit accéder à une variable de l’interpréteur TCL, il faut appeler Tcl_SetVar ou Tcl_SetVar2Ex. Nous sommes dans une logique d'"embedding" pour laquelle SWIG n'aide pas. - W
__________________
Architectures Post-Modernes |
|
|
|
00
|
|
|
#5 |
|
Membre du Club
![]() Inscription : décembre 2002 Messages : 151 ![]() |
SWIG est très souple, puisqu'il permet à l'utilisateur de déclarer des spécifications pour la création du wrapper, comme par exemple que faire lors de l'utilisation d'un char** ou même d'un type inconnu. Il doit donc être possible (par l'intermédiaire d'une spécification que je ne connais pas encore) de lui faire utiliser la fonction Tcl_SetVar dans le wrapper.
|
|
|
00
|
|
|
#6 | ||
|
Membre du Club
![]() Inscription : décembre 2002 Messages : 151 ![]() |
Finalement, j'ai déclaré un typemap pour ma méthode et dedans j'ai fait appel à Tcl_SetVar et ça fonctionne correctement.
Par contre maintenant j'ai un autre souci : le wrapper par défaut prend en compte le bon nombre d'arguments de ma méthode puisqu'il génère ceci : Code :
if (SWIG_GetArgs(interp, objc, objv,"ooo:SERIAL_Read self cc nbc ",(void *)0,(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; Code :
if (SWIG_GetArgs(interp, objc, objv,"oo:SERIAL_Read self cc ?nbc? ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail; J'ai déclaré mon typemap ainsi : Code :
Merci |
||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com