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

C++ Discussion :

call lua overrided function from c++


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 33
    Points : 23
    Points
    23
    Par défaut call lua overrided function from c++
    yop,
    je bosse sur un système de script lua pour étendre les possibilités d'une appli.
    Donc j'ai wrappé une classe c++ en lua (a l'aide de table, métatable et userdata) pour pouvoir créer et utiliser un objet de ce type. Ca marche. Mais l'idée, c'est de pouvoir faire ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    frame1 = Frame.new("nom")
     
    function frame1:Draw()
        -- code de dessin
    end
    ensuite en c++ j'appelle frame1 : Draw lorsque j'ai besoin de dessiner la fenetre.
    Faudrait stocker la table lua quand je crée l'objet, ensuite quand j'appelle Draw en c++, ca appelle la fonction Draw de la table, si elle est overrided ca l'appelle, sinon ca revient a la méthode de base. Mais impossible de trouver comment stocker un pointeur de table lua en c++.

    Quelqu'un a une idée?
    (dsl si c'est pas la bonne partie du fofo mais je savais pas trop ou poster)

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 1
    Points : 2
    Points
    2
    Par défaut
    Luabind ?

    C++ classes in Lua
    Overloaded member functions
    ...

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 33
    Points : 23
    Points
    23
    Par défaut
    plutot mourir.
    Je suis sur VS2010 et luabind est compilé avec une ancienne version, donc faut le recompiler, en plus il utilise des variadic templates, pas supporté par VS. J'ai déja perdu trop de temps à essayer de le faire marcher sans résultats.

  4. #4
    screetch
    Invité(e)
    Par défaut
    ah ben y'a plus que la magie alors. Bonne chance.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    cherche luna, c'est un wrapper lua<->C++ fonctionnel qui te fournit une classe de base dont il suffit d'hériter.
    Il te suffira d'écrire ton luamanager pour charger les classes ainsi créées
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 33
    Points : 23
    Points
    23
    Par défaut
    trés interressant ce luna ! je suis entrain de regarder, ca m'a l'air bien sympa merci.
    Par contre rien sur l'override de fonctions c++ en lua. Mais j'ai trouvé la solution : luaL_ref() ca conserve un pointeur vers un objet lua. ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int ptr = luaL_ref(L, LUA_REGISTRYINDEX);
     
    ...
     
    lua_rawgeti(L, LUA_REGISTRYINDEX, ptr);
    lua_getfield(L, -1, "nomdefonction");
    Autre question pendant que j'y suis, je crée un userdata auquel j'associe une metatable avec une fonction __gc dedans.
    Dans un script je fais ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    function test()
        local ud = myclass.new()    -- appel du constructeur, ca crée le userdata
        ud:testfunction()
    end    -- fin de la fonction, ud devrait etre détruit
    seulement voilà, l'appelle du __gc de ma classe n'est pas appellé a la fin de la fonction, mais quand je ferme la session Lua ( a la fin du programme quoi )
    quelqu'un sait pourquoi?

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    qu'est-ce que tu entends par override de fonctions C++ ?
    luna te permet de créer des objets LUA à partir de class C++


    quant à __gc, lua utilise un garbage collector
    l'objet sera supprimé, mais on sait pas trop quand
    il y a un moyen de forcer l'appel du gc normalement, peu utile en pratique
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    screetch
    Invité(e)
    Par défaut
    Citation Envoyé par biyoudidou Voir le message
    seulement voilà, l'appelle du __gc de ma classe n'est pas appellé a la fin de la fonction, mais quand je ferme la session Lua ( a la fin du programme quoi )
    quelqu'un sait pourquoi?
    parce que Lua a un garbage collector et que la désallocation n'est donc pas immédiate. mais tu peux appeler toi même lua_gc si tu sais ce que tu fais.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 33
    Points : 23
    Points
    23
    Par défaut
    qu'est-ce que tu entends par override de fonctions C++ ?
    luna te permet de créer des objets LUA à partir de class C++
    oui, mais ce que je veux c'est que ce soit réciproque, appeller des fonctions c++ a partir de lua, et des fonctions lua a partir de c++, un objet hybride quoi, a la fois lua et c++.

    ex, sans référence on à ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    // code c++
    Frame * frame1;
    class Frame
    {
        static int New(lua_State * L)
        {
            // allocation en lua, ect...
            frame1 = userdata;
        }
        void Draw()
        {
            printf("Frame.Draw() c++");
        }
    };
     
    // code lua
    frame1 = Frame.New()
    function frame1:Draw()
        print("Frame.Draw() overrided with lua")
    end
     
    frame1:Draw()    // "Frame.Draw() overrided with lua"
     
    // code c++
    frame1->Draw()    // "Frame.Draw() c++"
    Avec les références, on stocke la référence de l'objet lua dans la class Frame, et dans Draw() on vérifie si la fonction est overrided dans l'objet lua.
    et du coup quand tu fais frame1->Draw(), ca print("Frame.Draw() overrided with lua")

    parce que Lua a un garbage collector et que la désallocation n'est donc pas immédiate. mais tu peux appeler toi même lua_gc si tu sais ce que tu fais.
    hun hun.... mais je croyais qu'un garbage collector supprimais les objets quand on sort du scope dans lequel ils sont définis? comme en .net il me semble...
    Du coup ca me pose un problème, car je passe a Draw un objet pour pouvoir faire le dessin, et dans la fonction draw yaura peut etre des allocations style Brush Direct2D (je sais pas encore comment je vais gérer ca, je tatonne), du coup, si la fonction est appellée 60 fois par seconde, je me retrouve avec 60 allocations pour l'argument, et au moins 60 alloc de brush Direct2D, et je sais pas quand elles vont etre libérées :/

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Je me répète, mais tu ne sembles pas avoir compris comment fonctionne le Lua et l'utilité de luna.

    Le lua, à la base, c'est un langage de script écrit en C, et donc s'intègre un peu où l'on veut.
    luna c'est un wrapper qui permet d'utiliser des objets C++ en Lua, en particulier des méthodes C++ : appel en Lua de code C++
    pour appeler des fonctions Lua en C++, il n'y a besoin de rien, encore heureux, c'est le principe de base du langage quand même !
    et la doc officielle indique l'utilisation de lua_pcall nécessitant au préalable de push les arguments s'il y en a

    attention en cas d'erreur d'appel, la pile Lua en prend un coup (et il faut dépiler 2 éléments je crois de mémoire)

    non le garbage collector, il s'exécute de temps en temps et fait un clean

    edit : ton objet il n'est pas du tout hybride et c'est un terme vraiment qui me gène et que je bannirai
    tu as une classe C++ qui sert d'objet Lua
    Lua, grâce au wrapper luna qui simplifie ça pour nous, peut instancier un objet Lua, d'après la classe C++, et utiliser les méthodes qui ont été choisies comme accessibles en Lua
    ce n'est pas un objet C++, c'est un objet Lua que tu utilises en Lua
    si tu veux créer un objet C++ qui s'y lie, il faut faire toi-même la manipulation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class MyCObj {};
    class MyLuaObj : public luna<MyLuaObj> { myCObj* m_pCObj; }
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  11. #11
    screetch
    Invité(e)
    Par défaut
    Sinon tu peux regarder du coté de Swig
    cela permet de générer du code "glu" entre C++ et Lua pour faire comme si il n'y avait qu'un seul langage.

  12. #12
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 33
    Points : 23
    Points
    23
    Par défaut
    moui je sais j'ai bien compris ^^ luna c'est un wrapper.
    j'avais déjà mon propre wrapper pour mes classes c++, mais luna est écris différemment (utilise des closure par exemple, c'est mieux foutu ^^). Mais osef, j'ai mes classes c++ en lua, ça marche c'est bien.

    Maintenant, imagine que ce que tu veux, c'est contrôler le dessin des Frame par des fonctions lua.
    Donc tu crée un objet Frame en lua. Ça crée un pointeur vers une instance c++.
    Tu ajouter un pointeur de cette instance c++, a la liste des frames qui doivent être rendu par l'application.
    Chaque fois qu'elle a besoin d’être redessinée, l'application appelle la méthode Draw() de l'objet c++.
    Mais si tu as réécris la fonction Draw() en lua, elle est stockée dans l'objet lua, pas dans l'objet c++. Donc la fonction lua n'est pas appelée. Donc, j'ajoute une référence de l'objet lua, dans l'objet c++, pour pouvoir appeler sa fonction Draw().

    pour appeler des fonctions Lua en C++, il n'y a besoin de rien
    quand c'est de simples fonctions oui, pas quand c'est des fonctions membres. Car dans ce cas la, il faut un pointeur vers l'objet (la table en fait) qui contient la fonction.
    ce n'est pas un objet C++, c'est un objet Lua que tu utilises en Lua
    ben... oui et non... un userdata, c'est un pointeur vers un block mémoire. Qui contient généralement une instance de la classe c++(ou un pointeur vers...). Il peut pas etre utilisé directement en lua, par contre il peut etre utilisé par les fonctions wrappés qui sont associées a l'objet lua.
    D'ailleur luna fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    static int constructor(lua_State *L) {
          T* obj = new T(L);
          lua_newtable(L);
          lua_pushnumber(L, 0);
          T** a = (T**)lua_newuserdata(L, sizeof(T*));
          *a = obj;
          ...
    désolé si je manque de clarté :s
    en tous cas prob résolu, merci des réponses ^^

    (par reference, j'entends ceci lua reference, pas les references c++ bien entendu)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. call a C function from another function !
    Par Student_Master dans le forum C
    Réponses: 7
    Dernier message: 29/07/2011, 11h01
  2. Call to undefined function mysql_pconnect()
    Par shirya dans le forum Installation
    Réponses: 2
    Dernier message: 03/11/2005, 21h55

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