2009-12-29 3 views
4

J'ai des objets C++ et j'ai Lua objets/tables. (Ont également SWIG liaisons C++.)Suivi des tables Lua en C

Ce que je dois être en mesure de faire est d'associer les deux objets de sorte que si je ne dis

CObject* o1 = getObject(); 
o1->Update(); 

il fera l'équivalent Lua:

myluatable1.Update(); 

jusqu'à présent, je peux imaginer que CObject :: Mise à jour aurait le code suivant:

void CObject::Update(){ 
    // Acquire table. 

    // ??? 

    // Do the following operations on the table. 
    lua_getfield(L, -1, "Update"); 
    lua_pcall(L, 0, 0, 0); 
} 

Comment est-ce que je devrais stocker/placer la table de Lua à employer, et ce qui irait dans le // ??? ci-dessus pour faire fonctionner l'appel de mise à jour?

+0

Pourrait-on assigner un identifiant entier à l'objet C++ et stocker la table associée dans une table globale appelée alias globaltable [tableID] = associatedTable? –

Répondre

17

Je ne peux pas croire que personne ne s'en soit aperçu!

http://www.lua.org/pil/27.3.2.html

Une partie de l'API Lua pour stocker des références à des objets de Lua et tables et retourner des références à des fins d'être stockées dans les structures C !!

+0

Pourriez-vous développer cette section? J'essaie de faire exactement cela, mais je me bats un peu avec la mise en œuvre. Avez-vous un bref exemple à montrer? Je serais reconnaissant! Merci. – crush

+0

Voir https://github.com/Tarendai/Shard/blob/master/src/TestAI.cpp#L154 –

+0

Cette ligne de code appelle essentiellement le lua: ai: Init() d'un contexte C++ –

2

Je suis curieux pour les raisons de cette « inverse SWIG » ...

Les objets Lua vivent dans les contextes Lua, donc au moins vous devez stocker « L » à l'intérieur de votre objet. Le problème du passage du "pointeur de table" est un peu plus délicat - même si Lua permet de récupérer le pointeur de la pile Lua (en utilisant lua_topointer()), il n'y a aucun moyen de le remettre. Bien entendu - car sinon il faudrait aussi vérifier que le pointeur pointe vers un objet valide, etc., etc.

Ce que vous pouvez faire, cependant, est de stocker les références aux tables de la table globale, l'index étant la lightuserdata étant le pointeur vers votre objet. Puis en ayant l'état Lua, et le nom du tableau global, vous pouvez récupérer la référence à la table et la pousser sur la pile Lua pour ce contexte. Ceci est sommaire, et je n'ai même pas abordé la question de la collecte des ordures avec cette construction.

Mais dans tous les cas, cela ne va pas être le rendement de la vitesse de course, et ressemble beaucoup à du code C++. J'essaierais de reconsidérer l'approche et de pousser une partie de ce que vous voulez faire dans le domaine de Lua.

p.s. On dirait que c'est la troisième question qui semble presque dupe des deux précédentes, here et here sont les précédentes. Si ceux-ci n'ont pas reçu de réponse complète, il aurait été préférable de les modifier/ajouter la prime pour accumuler les réponses.

+0

les 3 questions ont leurs différences bien qu'elles aient le même objectif éventuel, je peux tout déplacer en pure lua dans un projet résolvant le problème, mais ceci pour un autre projet il faudrait que je réécrive de grandes parties du projet. –

+0

Ah ok, merci. N'oublie pas mes p.s. alors et bonne chance! –