2017-03-01 1 views
2

Utilisation du Lua 5.3.4 API C, cela fonctionne:Quelle est la différence entre "dofile" dans lua et "luaL_dofile" dans l'API C?

luaL_dostring(lua, "dofile('mnemonics.lua')"); 

Mais cela ne fonctionne pas pour exécuter le fichier:

luaL_dofile(lua, "mnemonics.lua"); 

Au lieu de cela, il signale "tentative d'appeler une valeur de chaîne".

Quand je remplace avec

luaL_loadfile(lua, "mnemonics.lua"); 

retourne LUA_OK, mais il ne pousse pas une fonction sur la pile comme il est censé. En fait, la pile est vide (gettop signale 0) par la suite.

Je peux utiliser la solution de contournement dostring, mais soit il me manque quelque chose, soit il y a un bug.

+3

C'est vraiment bizarre. Une conjecture sauvage: quelque chose qui est arrivé plus tôt dans votre code C a corrompu votre état de 'lua'? Essayez d'exécuter le programme avec Valgrind. –

+5

Pouvez-vous nous montrer un exemple minimal qui reproduit le problème que vous voyez parce que je ne peux pas. – greatwolf

+0

Dans la recherche d'un exemple minimal, j'ai trouvé que le problème était causé en essayant de faire apparaître une pile vide. J'avais mal compris le comportement d'un appel à 'lua_settable'. Je crois que la raison pour laquelle la commande Lua a fonctionné quand la commande de l'API C n'était pas est que la pile est nettoyée lors de la transition entre le code C et le code Lua. – Octa9on

Répondre

0

L'effacement d'une pile vide provoquera un comportement inattendu. L'interpréteur Lua nettoie la pile entre l'exécution du code C et l'exécution du code Lua, de sorte que la pile foirée n'affecte pas le dofile dans Lua.