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 averti
    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
    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
    Invit� de passage
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    1
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 1
    Par d�faut
    Luabind ?

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

  3. #3
    Membre averti
    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
    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 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    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 averti
    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
    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 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    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 averti
    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
    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 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    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 averti
    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
    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