Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    décembre 2002
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : décembre 2002
    Messages : 154
    Points : 48
    Points
    48

    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
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    5 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 5 462
    Points : 8 259
    Points
    8 259

    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

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    décembre 2002
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : décembre 2002
    Messages : 154
    Points : 48
    Points
    48

    Par défaut

    Effectivement ça pourrait être une piste à creuser, mais je ne vois pas trop comment l'utiliser avec Swig

  4. #4
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    5 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 5 462
    Points : 8 259
    Points
    8 259

    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

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    décembre 2002
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : décembre 2002
    Messages : 154
    Points : 48
    Points
    48

    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 du Club
    Profil pro
    Inscrit en
    décembre 2002
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : décembre 2002
    Messages : 154
    Points : 48
    Points
    48

    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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •