2015-11-12 1 views
2

Mon application est capable de pousser une fonction dans une liste Todo en utilisant un code comme: test de fonctionnement() print ("coucou") finalComment comparer 2 fonctions passées comme argument

todo:pushtask(test) -- First push 
todo:pushtask(test) -- Second push 

en interne, la liste de tâches est une table de C entier où je pousse une référence à la fonction passée a de:

int func = luaL_ref(L, LUA_REGISTRYINDEX); 

Mais comment puis-je détecter si je pousse la même fonction? Selon mon test, luaL_ref renvoie des références différentes même si la même fonction est poussée (disons ref # 1 et # 2) Comment puis-je vérifier si # 1 et # 2 sont des références à la même fonction?

Merci

Laurent

Répondre

1

Les fonctions peuvent être directement comparés. Pour voir si vous avez la même fonction, vous devez le comparer aux autres fonctions que vous avez déjà.

luaL_ref ne fait pas cette comparaison pour vous (il ne devrait pas le faire).

Si vous voulez faire cela, vous devez conserver, en plus de la référence luaL_ref (ou éventuellement à la place de), une table lua avec les fonctions poussées comme touches. Cela vous permettra ensuite de rechercher la nouvelle fonction dans la table et de déterminer (aux coûts d'accès à la table de hachage au lieu des coûts de traversée de la liste) si cette fonction a été ajoutée avant ou non.

+0

Merci pour votre réponse. Mais, tout le traitement de la liste TODO est fait en C: est-ce un moyen simple de le faire directement à partir du code C? – destroyedlolo

+0

Vous pouvez le faire à partir de 'C' juste très bien. Vous avez juste besoin de garder la table en lua (mais vous pouvez la gérer avec le code 'C'). Vous pouvez * éviter * la table et simplement boucler chaque élément dans la table de références à chaque fois si vous le souhaitez (mais je ** vraiment ** ne le suggère pas). –

+0

Malheureusement, j'ai besoin de boucle: une fonction peut-être appelée une seule fois ou plusieurs fois en fonction du contexte. Cette liste de tâches conduit les événements arrivant à une interface graphique: pour certains d'entre eux, chaque instance est significative (arrivée d'une donnée), d'autres non (demande de mise à jour de l'interface avec une nouvelle donnée). Et même pour "l'arrivée des données", on ne peut considérer que le dernier dans certaines circonstances (c'est-à-dire lorsque sa fenêtre est en arrière-plan). – destroyedlolo