[CPP/Lua] Pointeur sur table

Pointeur sur table [CPP/Lua] - C++ - Programmation

Marsh Posté le 22-02-2012 à 15:45:14    

bonjour :hello:

 

Je cherche à faire en sorte d'avoir une instance d'une classe qui ait un 'clone' en lua, c'est à dire que je puisse toujours récupérer une certaine table en lua, et appeler des fonctions sur celle-ci, j'm'explique:

 

Voilà une table en lua, qui possède une certaine fonction :

Code :
  1. lua_table = {};
  2. function lua_table:fonction()
  3. print("tralala" );
  4. end
 

Et une certaine class en CPP :

 
Code :
  1. lua_table = {};
  2. function lua_table:fonction()
  3. print("tralala" );
  4. end
  5. class UneClasse
  6. {
  7. private:
  8.  lua_table  * table;
  9. public:
  10.  void fonction()
  11.  {
  12.   // et la je pourrais appeller la fonction 'function' de mon 'lua_table' en utilisant le pointer 'table'
  13.  }
  14. };
 

Je vois à peut près comment faire ça dans ce cas, mais le truc c'est que j'utilise un pseudo system de class en lua, et je peux créer de nouvelles classes via lua en faisant

 
Code :
  1. function class_ctor(self,var)
  2.   self.a = var;
  3. end
  4. uneClass = class(class_ctor,'uneClass');
  5. function uneClass:fonction()
  6.   print(self.a);
  7. end
 

Et je peux créer une instance de la class en faisant comme ceci :

Code :
  1. uneInstance = uneClass(120);
  2. uneInstance:fonction() -- Là j'imprime la variable 'a' de mon instance, qui est 120.
 

Du coups, je voudrais que ma classe CPP puisse avoir un pointeur sur la table de retours lorsque j'appelle 'uneClass(120)' par exemple.

 

J'espère que vous avez compris c'que j'ai fait, j'm'exprime pas forcément bien :D

 

Merci à vous :)

 

edit : J'ai peut être plus ou moins réussi, à un détail près :

 

J'ai ajouté au code source de lua une fonction lua_pushtable :

 
Code :
  1. LUA_API void lua_pushtable(lua_State * L, void*ptr) {
  2. lua_lock(L);
  3. sethvalue(L,L->top,ptr);
  4. api_incr_top(L);
  5. lua_unlock(L);
  6. }
 

Voilà comment je procède dans mon programme par la suite :

 
Code :
  1. lua_getglobal(L,"Inst" );
  2.     const void*ptr = lua_topointer(L,-1);
  3.     lua_pop(L,1);
  4.     lua_pushtable(L,(void*)ptr);
  5.     lua_getfield(L,-1,"show" );
  6.     if (lua_isfunction(L,-1))
  7.     {
  8.        
  9.         lua_call(L,0,0);
  10.     }
 

Donc il récupère bien la table 'Inst', la stock dans le pointeur et appelle la fonction show, le soucis c'est que show est définie comme ceci en lua :

Code :
  1. function Inst:show()
  2.      print(self.name);
  3. end
 

Du coups, en lua pour appeller cette fonction je suis supposé écrire 'Inst:show()', mais le lua_call que je fais en CPP correspond à 'Inst.show()', je perd donc le précieux self.. Comment je peux remédier à ça ?


Message édité par Terminapor le 22-02-2012 à 16:53:27

---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 22-02-2012 à 15:45:14   

Reply

Marsh Posté le 22-02-2012 à 20:50:37    

Bon j'ai finalement réussi :D

Code :
  1. lua_getglobal(L,"Inst" );
  2.         const void*ptr = lua_topointer(L,-1);
  3.         lua_pop(L,1);
  4.         lua_pushtable(L,(void*)ptr);
  5.         lua_callmeta(L,1,"show" );
  6.         lua_pop(L,2);


 
Y'a peut être même pas besoin de pointeur, apparemment on peut utiliser un système de registre :)
 
Ciaossu !


---------------
Perhaps you don't deserve to breathe
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed