IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaçage autre langage Python Discussion :

Swig C++ Tcl - remplir un buffer


Sujet :

Interfaçage autre langage Python

  1. #1
    Membre régulier Avatar de scorbo
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 176
    Points : 83
    Points
    83
    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 !

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    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.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre régulier Avatar de scorbo
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 176
    Points : 83
    Points
    83
    Par défaut
    Effectivement ça pourrait être une piste à creuser, mais je ne vois pas trop comment l'utiliser avec Swig

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    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.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre régulier Avatar de scorbo
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 176
    Points : 83
    Points
    83
    Par défaut
    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.

  6. #6
    Membre régulier Avatar de scorbo
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 176
    Points : 83
    Points
    83
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    %typemap(in) (char *cc, int nbc) { 
    }
    Est-ce qu'il manque quelque chose à mon typemap ?


    Merci

Discussions similaires

  1. Remplir un buffer char*
    Par stalker00 dans le forum Débuter
    Réponses: 4
    Dernier message: 03/05/2011, 14h57
  2. [WD14] Remplir un buffer
    Par reitsab dans le forum WinDev
    Réponses: 4
    Dernier message: 11/12/2009, 15h08
  3. Remplir l'intérieur d'une vue en coupe - Stencil buffer?
    Par ShevchenKik dans le forum OpenGL
    Réponses: 3
    Dernier message: 12/11/2008, 21h06
  4. Affichage en passant par un buffer...
    Par Sirotilc dans le forum MFC
    Réponses: 5
    Dernier message: 27/05/2002, 21h00
  5. Alpha blending et Z-buffer directx 8
    Par Cesar4 dans le forum DirectX
    Réponses: 1
    Dernier message: 23/05/2002, 12h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo