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

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    octobre 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2009
    Messages : 104
    Points : 614
    Points
    614

    Par défaut Appels de méthodes déterminés dynamiquement

    Bonjour,

    Je vous propose mon premier article, concernant un système en C++ pour appeler des méthodes dont le nom et les paramètres ne sont connus qu'à l'exécution.

    Le synopsis est le suivant :
    Cet article présente une technique pour appeler des méthodes de certaines classes dans un système de type « script ». Dans une telle situation, les méthodes et leurs paramètres ne sont connus qu'à l'exécution, sous la forme de chaînes de caractères.
    N'hésitez pas à laisser vos remarques et suggestions dans ce fil de discussion.

    Merci

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2008
    Messages : 7 634
    Points : 13 480
    Points
    13 480

    Par défaut

    Salut,
    C'est un article intéressant, bien expliqué et de bonne qualité. Le code présenté est clair et complet.

    Tu t'en sers pour rendre tes applications scriptables ? Quels types d'utilisations as-tu ?

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    octobre 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2009
    Messages : 104
    Points : 614
    Points
    614

    Par défaut

    Citation Envoyé par 3DArchi Voir le message
    Salut,
    C'est un article intéressant, bien expliqué et de bonne qualité. Le code présenté est clair et complet.

    Tu t'en sers pour rendre tes applications scriptables ? Quels types d'utilisations as-tu ?
    Merci pour ces commentaires. Nous utilisons en effet ce système pour scripter des scènes dans notre jeu. L'idée de départ était de pouvoir contrôler les personnages comme dans une pièce de théâtre, c'est-à-dire que les actions se font en séquence et que le déroulement de la scène est déterminé à l'avance. Cela signifie en particulier qu'il n'y a pas de structures de contrôle (conditionnelle, boucle). Nous avons donc des fichiers décrivant la scène par une série d'appels à des fonctions sur des objets connus. Par exemple :
    0 camera.smooth_activate(0.5);
    0 player_1.stop();
    0 player_2.stop();
    0.1 player_1.do_action(move_right,0.6);
    0.1 bridge.activate();
    Nous nous étions initialement penché sur LUA pour scripter les scènes, mais son intégration nous a semblé trop coûteuse. Nous avons donc mis en place le système de cet article, en nous inspirant de la solution utilisée dans wxWidgets pour construire la table des méthodes exportées. Le résultat est moins puissant que LUA mais couvre parfaitement nos besoins. Au final, le seul coût pour utiliser une méthode dans un script consiste à hériter de 'base_exportable' et d'ajouter une ligne pour effectuer l'export.

    De plus, c'était très intéressant à mettre en place

  4. #4
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2009
    Messages : 560
    Points : 623
    Points
    623

    Par défaut

    Cela se rapproche de mes besoins, si ce n'est que moi c'est dans un cadre factory >< !

    En gros, j'ai un fichier (pareil) ou on spécifie les implémentation de types divers et leurs arguments... Le but et de parsé se fichier, tout en tenant en compte de l'évolutivité du truc.

    En gros, l'idée et pour la classe utilisatrice de faire create(string,vector<any>) et pour les dites classes, ne mettre du code que dans leur fichier respectif >< !

    J'avoue je coince un peu... J'ai réussi à faire en sorte de ne "pas" les initialisé dans l'objet "maître", mais je souffre d'un affreux paradoxe... Dont je discuterai peut-être plus tard !

    En tout cas, je vais voir si je peux pas m'inspirer un peu de ce que tu fais ^^ !
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  5. #5
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : juin 2005
    Messages : 8 575
    Points : 11 394
    Points
    11 394

    Par défaut

    Article très intéressant ! Ca nous change un peu du style d'article habituel.

    Tout d'abord, j'veux bien te croire quand tu dis que c'était intéressant à mettre en place. D'autre part... as-tu prévu une "suite" à cet article ? C'est à dire utilisation de ce système pour quelque chose de plus gros par exemple ? Un langage plus "complet", avec JIT compilation ?

    Merci beaucoup en tout cas pour celui-là déjà

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2008
    Messages : 7 634
    Points : 13 480
    Points
    13 480

    Par défaut

    Citation Envoyé par j-jorge Voir le message
    Nous nous étions initialement penché sur LUA pour scripter les scènes, mais son intégration nous a semblé trop coûteuse.
    Est ce que vous aviez regardé du côte de Boost.Python ? Il me semble que ça aurait aussi permis d'ouvrir l'appli vers des scripts python. En plus vous êtes déjà en wxWidgets dis-tu et il y a un binding vers Python de cette bibliothèque.
    Citation Envoyé par j-jorge Voir le message
    De plus, c'était très intéressant à mettre en place
    C'est en forgeant...

  7. #7
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 28
    Localisation : France

    Informations forums :
    Inscription : juillet 2008
    Messages : 1 580
    Points : 2 202
    Points
    2 202

    Par défaut

    Citation Envoyé par Lavock Voir le message
    Cela se rapproche de mes besoins, si ce n'est que moi c'est dans un cadre factory >< !

    En gros, j'ai un fichier (pareil) ou on spécifie les implémentation de types divers et leurs arguments... Le but et de parsé se fichier, tout en tenant en compte de l'évolutivité du truc.

    En gros, l'idée et pour la classe utilisatrice de faire create(string,vector<any>) et pour les dites classes, ne mettre du code que dans leur fichier respectif >< !

    J'avoue je coince un peu... J'ai réussi à faire en sorte de ne "pas" les initialisé dans l'objet "maître", mais je souffre d'un affreux paradoxe... Dont je discuterai peut-être plus tard !

    En tout cas, je vais voir si je peux pas m'inspirer un peu de ce que tu fais ^^ !
    J'ai peut être mal compris, mais ça se résume pas à l'object factory de loki ça? pouvoir créer des objets sans connaitre leur type / ou avec une forme non-compatible avec la syntaxe C++? (fichier, string etc)
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  8. #8
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2009
    Messages : 560
    Points : 623
    Points
    623

    Par défaut

    Justement, je suis en train de regarder. Mais pas sur que ça fasse TOUT ce que je veuille. Je ferai un autre thread si nécessaire.
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  9. #9
    Membre confirmé

    Profil pro
    Inscrit en
    octobre 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2009
    Messages : 104
    Points : 614
    Points
    614

    Par défaut

    Citation Envoyé par Alp Voir le message
    Article très intéressant ! Ca nous change un peu du style d'article habituel.

    Tout d'abord, j'veux bien te croire quand tu dis que c'était intéressant à mettre en place. D'autre part... as-tu prévu une "suite" à cet article ? C'est à dire utilisation de ce système pour quelque chose de plus gros par exemple ? Un langage plus "complet", avec JIT compilation ?

    Merci beaucoup en tout cas pour celui-là déjà
    Merci pour ces retours. A priori, ce système répond bien à nos besoins, il ne devrait plus grossir. Du coup, le prochain article sera sur un tout autre sujet, mais c'est une surprise… dont je parle dans un autre post

    Citation Envoyé par 3DArchi Voir le message
    Est ce que vous aviez regardé du côte de Boost.Python ? Il me semble que ça aurait aussi permis d'ouvrir l'appli vers des scripts python. En plus vous êtes déjà en wxWidgets dis-tu et il y a un binding vers Python de cette bibliothèque.
    Je ne me souviens pas avoir regardé du côté de Boost.Python, mais c'est peut être juste parce que je n'apprécie pas de programmer dans ce langage. Je crois que nous avions trouvé un autre système du type LUA, mais je ne me souviens pas du langage. Peut-être du php… Dans tous les cas, ce sont des solutions un peu démesurée pour les petits scripts que nous voulons faire.

  10. #10
    Membre éprouvé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    mars 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : mars 2009
    Messages : 535
    Points : 1 004
    Points
    1 004

    Par défaut

    Merci pour l'article.

    Bien vu pour la template, je me demandais comment on pouvait faire ça "proprement" sans monter une hiérarchie en arbre avec un "Object" au sommet, comme dans Qt, Java, dot net,...

    Citation Envoyé par Lavock Voir le message
    En gros, l'idée et pour la classe utilisatrice de faire create(string,vector<any>) et pour les dites classes, ne mettre du code que dans leur fichier respectif >< !
    La méthode de la template doit difficilement s'appliquer. Un méthode "java" like doit mieux convenir...

    Le tout est de pouvoir connaitre le type de Object pour savoir comment caster dans "create" par exemple. Il faut l'équivalent de instanceof pour ceci.

    Pour ceux que ça intéresse :

    - QObject de chez Qt, qui permet de coder un arbre d'héritage, semble donner une bonne idée de comment y parvenir. Même si "inherits" est pas idéal pour les performances...
    http://qt.developpez.com/doc/latest/...bjectname-prop

    - Regarder comment s'articule les classes Java : "Object" et "Class" permet de se faire une bonne idée de comment monter un interpréteur pour un langage objet en C/C++

  11. #11
    Rédacteur
    Avatar de Amnell
    Homme Profil pro
    Étudiant
    Inscrit en
    mars 2009
    Messages
    1 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mars 2009
    Messages : 1 840
    Points : 5 814
    Points
    5 814

    Par défaut

    Article très intéressant, et très bien écrit !
    Toutefois, n'y a-t-il pas une faut d'accord dans le titre (car on dit une méthode, non un méthode) ?
    N'oubliez pas de consulter la FAQ Qt ainsi que les cours et tutoriels C++/Qt !

    Dernier article : Débuter avec les Enlightenment Foundation Libraries (EFL)
    Dernières traductions : Introduction à Qt Quick - Applications modernes avec Qt et QML
    Vous cherchez un livre sur Qt 5, Qt Quick et QML ? Créer des applications avec Qt 5 - Les essentiels

  12. #12
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    août 2003
    Messages
    5 217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : août 2003
    Messages : 5 217
    Points : 10 579
    Points
    10 579

    Par défaut

    On dit même : "une fonction membre".
    Dans le glossaire de la bible, "méthode" == "fonction membre virtuelle", donc autant éviter le terme vu que pour quantité d'autres personnes, le "virtuel" n'est pas implicite quand ils parlent de "méthode".
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  13. #13
    Membre confirmé

    Profil pro
    Inscrit en
    octobre 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2009
    Messages : 104
    Points : 614
    Points
    614

    Par défaut

    Citation Envoyé par Amnell Voir le message
    Article très intéressant, et très bien écrit !
    Toutefois, n'y a-t-il pas une faut d'accord dans le titre (car on dit une méthode, non un méthode) ?
    Je l'avais écrit en pensant que ce sont les appels qui sont déterminés à l'exécution. C'est ambiguë mais je n'avais pas trouvé d'autre formulation.

Discussions similaires

  1. Appeler une méthode serveur sur un imageButton dynamique
    Par Ghunter59 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 10/06/2009, 13h24
  2. Réponses: 1
    Dernier message: 06/09/2008, 13h54
  3. Appeler une méthode dynamiquement
    Par doof dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 04/01/2005, 00h15

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