2011-07-19 64 views
0

我試圖打電話叫test2.lua 一個Lua文件裏面的函數這是test2.lua的內容:的Lua:讓全局函數加載文件後未能

function abc(path) 
t = {} 
table.insert(t, "a") 
return t 
end 

正如你所看到的它只需要一個輸入並返回一個字符串。

這是我的C代碼。這很簡單。然而,我的調用getglobal爲了調用該函數不起作用... lua_getglobal說,它不是一個函數,當我測試它......任何理由爲什麼這是?不應該是在源文件內部可返回的全局函數嗎?那麼爲什麼它只能找到這個全球性的零?

L = lua_open(); 
luaL_openlibs(L); 
luaL_loadfile(L, "src/test2.lua"); 

lua_getglobal(L, "abc"); 

lua_pushstring(L, "coollll"); 

int error = 0; 
if ((error = lua_pcall(L, 1, 1, 0)) == 0) 
{ 
    std::cout << "cool"; 
} 

編輯:

調用lua_getglobal引起我的節目,打破控制,無論使用的loadFile或dofile處理的......任何想法,爲什麼?

lua_getglobal crashing program

回答

8

函數luaL_loadfile()讀取,分析和編譯指定的Lua文件。它不執行任何內容。這對你的情況很重要,因爲function abc(path) ... end聲明在執行前沒有可見的效果。正如您所使用的關鍵字function這相當於寫

abc = function(path) 
    t = {} 
    table.insert(t, "a") 
    return t 
end 

在這種形式下,更直觀名爲abc變量,直到代碼執行實際上不分配一個值。

luaL_loadfile()返回時,它已經在Lua堆棧頂部推送了一個匿名函數,這是編譯文件的結果。你需要調用它,並lua_pcall()將做的伎倆。這種替換您參考luaL_loadfile()

if (luaL_loadfile(L, "src/test2.lua") || lua_pcall(L, 0, LUA_MULTRET, 0)) { 
    // do something with the error 
} 

在這一點上,test2.lua已執行任何功能,它定義或修改它其他的全局變量是可用的。

這是一個常見的習慣用法,即提供函數luaL_dofile()來加載並按名稱調用文件。

代碼中存在第二個更微妙的問題。函數abc()使用一個名爲t的變量,但您應該知道,所使用的t是一個全局變量。您可能打算在abc()的頂部寫local t = {}

+0

好的。所以我很好理解你必須運行該文件的概念,然後才能訪問該函數,直到代碼執行完畢。一切都很好。我將加載文件更改爲dofile。但是我有一個新問題。我可能會爲它創建一個新的問題,但lua_getglobal正在打破。發生時無論使用loadfile或dofile,在調用lua_getglobal(L,「trans」);它調用getfield後在luaS_newlstr中崩潰...:/ –

+0

http:// stackoverflow。COM /問題/ 6754778/LUA-getglobal-崩潰程序 –

3

這不是足以叫luaL_loadfile:這使一大塊壓入堆棧。或者跟進luaL_[p]call執行塊(從而使該功能可用),或使用luaL_dofile

+0

http://stackoverflow.com/questions/6754778/lua-getglobal-crashing-program –