2010-02-27 161 views
7

我將Lua嵌入到C/C++應用程序中。有沒有辦法從C/C++調用Lua函數而不先執行整個腳本?在不執行腳本的情況下調用Lua函數

我試着這樣做:

//call lua script from C/C++ program 
luaL_loadfile(L,"hello.lua"); 

//call lua function from C/C++ program 
lua_getglobal(L,"bar"); 
lua_call(L,0,0); 

但它給我:

PANIC: unprotected error in call to Lua API (attempt to call a nil value) 

我只能叫巴()當我這樣做:

//call lua script from C/C++ program 
luaL_dofile(L,"hello.lua"); //this executes the script once, which I don't like 

//call lua function from C/C++ program 
lua_getglobal(L,"bar"); 
lua_call(L,0,0); 

但它給了我這個:

hello 
stackoverflow!! 

我想這一點:

stackoverflow! 

這是我的LUA腳本:

print("hello"); 

function bar() 
print("stackoverflow!"); 
end 
+1

既然你要運行腳本來獲取Lua的VM看到它像伊坦表示你必須把解壓出來'功能欄()'到不同的文件,並運行該文件。 – greatwolf 2013-01-28 03:11:45

回答

13

正如freenode上luaL_loadfile #lua只是簡單地討論編譯文件轉換成可調用的塊,在這一點上文件內沒有任何代碼已經運行(包括函數定義),因此必須調用bar的定義來執行塊(這是luaL_dofile的作用)。

+0

我是那個在聊天時問過我的人:P – Person 2010-02-27 03:49:23

+0

我覺得你是個人,但是我認爲無論如何都要明確指出,以防萬一。 – 2010-02-27 04:19:50

1

發現必須運行該腳本才能調用該函數。

0

一個可能的解決方案/破解(和記住,我目前無法測試這一點)...


插入一個虛擬的「回報」;行在您的LUA代碼的頂部。

  • 載入你的文件轉換成字符串(就像您在準備使用luaL_loadstring()
  • 現在,應該是使用printf_s("return;\r\n%s", [pointer to string holding actual LUA code])
  • 現在你可以luaL_loadstring()串聯的字符串
一個簡單的事情

代碼仍然可以執行,但它應該在它實際上可以達到任何事情之前被切斷(例如,在您的print("hello");示例中,打印行將變得無法訪問)。它應該仍然更新所有功能原型的列表,你現在應該能夠使用lua_get()引用的功能。


注:對於那些誰也不知道爲「\ r \ n」是代表在Windows操作系統一個新行的轉義碼,它MUST是那些斜線...IE:本\ r \ n/R/N

相關問題