2017-03-01 60 views
2

使用的Lua 5.3.4 C API,這個工程:lua中的「dofile」和C API中的「luaL_dofile」有什麼區別?

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

但這未能執行該文件:

luaL_dofile(lua, "mnemonics.lua"); 

相反,它報告 「試圖調用一個字符串值」。

當我與

luaL_loadfile(lua, "mnemonics.lua"); 

返回LUA_OK取代它,但像它應該不會在堆棧上推功能。事實上,之後的堆棧是空的(gettop報告0)。

我可以使用dostring解決方法,但是我錯過了某些東西,或者有一個錯誤。

+3

這真的很奇怪。瘋狂的猜測:在你的C代碼早些時候發生的事情會破壞你的'lua'狀態?嘗試使用Valgrind運行該程序。 –

+5

你能告訴我們一個最小的例子,重現你看到的問題,因爲我不能。 – greatwolf

+0

在搜索一個最小的例子時,我發現問題是由於試圖彈出一個空棧而引起的。我誤解了對'lua_settable'調用的行爲。 我相信,當C API命令沒有執行時,Lua命令工作的原因是堆棧在C代碼和Lua代碼之間的轉換中得到清理。 – Octa9on

回答

0

從空棧中彈出會導致意外的行爲。 Lua解釋器清理執行C代碼和執行Lua代碼之間的堆棧,所以亂堆棧不會影響Lua中的dofile