Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope > Interfaçage autre langage
Interfaçage autre langage Forum d'entraide pour l'interfaçage avec d'autres langages (ctypes, api C, swig, ...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 19/09/2012, 09h12   #1
scorbo
Membre du Club
 
Inscription : décembre 2002
Messages : 151
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : décembre 2002
Messages : 151
Points : 46
Points : 46
Par défaut Swig C++ Tcl - remplir un buffer

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 !
scorbo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2012, 10h52   #2
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 693
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 693
Points : 4 521
Points : 4 521
Salut,

Citation:
Envoyé par scorbo Voir le message
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.
Je comprend que vous souhaitez interfacer un interpréteur TCL avec un programme C++.
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
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2012, 11h30   #3
scorbo
Membre du Club
 
Inscription : décembre 2002
Messages : 151
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : décembre 2002
Messages : 151
Points : 46
Points : 46
Effectivement ça pourrait être une piste à creuser, mais je ne vois pas trop comment l'utiliser avec Swig
scorbo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2012, 12h21   #4
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 693
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 693
Points : 4 521
Points : 4 521
Salut,

Citation:
Envoyé par scorbo Voir le message
Effectivement ça pourrait être une piste à creuser, mais je ne vois pas trop comment l'utiliser avec Swig
SWIG aide à étendre TCL à y ajoutant les fonctionnalités d'une librairie C.
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
wiztricks est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2012, 13h48   #5
scorbo
Membre du Club
 
Inscription : décembre 2002
Messages : 151
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : décembre 2002
Messages : 151
Points : 46
Points : 46
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.
scorbo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/10/2012, 09h02   #6
scorbo
Membre du Club
 
Inscription : décembre 2002
Messages : 151
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : décembre 2002
Messages : 151
Points : 46
Points : 46
Par défaut typemap supprime des arguments

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;
Par contre dès que je déclare mon typemap, il me génère ceci :
Code :
if (SWIG_GetArgs(interp, objc, objv,"oo:SERIAL_Read self cc ?nbc? ",(void *)0,(void *)0) == TCL_ERROR) SWIG_fail;
et je ne peux plus passer l'argument "nbc" à la méthode.

J'ai déclaré mon typemap ainsi :
Code :
1
2
%typemap(in) (char *cc, int nbc) { 
}
Est-ce qu'il manque quelque chose à mon typemap ?


Merci
scorbo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 00h00.


 
 
 
 
Partenaires

Hébergement Web