2011-12-19 81 views
3

我試圖從C中調用用戶定義的Lua函數。我已經看到了一些關於此的討論,並且解決方案似乎很清晰。我需要用luaL_ref()來獲取函數的索引,並保存返回的索引以備後用。從C調用Lua

在我的情況下,我用luaL_ref保存了值,而且我的C代碼需要調用luaL_ref保存的Lua函數。爲此,我使用lua_rawgeti,如下所示:

lua_rawgeti(l, LUA_REGISTRYINDEX, fIndex); 

這會導致lua_rawgeti崩潰。

我使用的fIndex是我從luaL_ref收到的值,所以我不確定這裏發生了什麼。

編輯:

我運行一個Lua腳本如下:

function errorFunc() 
    print("Error") 
end 

function savedFunc() 
    print("Saved") 
end 

mylib.save(savedFunc, errorFunc) 

我定義我自己的Lua庫 'MYLIB',與C函數:

static int save(lua_State *L) 
{ 
    int cIdx = myCIndex = luaL_ref(L, LUA_REGISTRYINDEX); 
    int eIdx = luaL_ref(L, LUA_REGISTRYINDEX); 

我將cIdx和eIdx保存到一個稍後的時間點,當我收到一些外部事件時,我希望在我的Lua腳本中調用其中一個設置爲參數的函數。在這裏,(在相同的線程上,使用相同的lua_State *),我打電話:

lua_rawgeti(L, LUA_REGISTRYINDEX, myCIndex); 

這是導致崩潰。

+1

爲了回答這個問題,我們需要看看你在哪裏得到你想要調用的「用戶定義的Lua函數」,以及如何將它存儲在註冊表中。 – 2011-12-19 06:41:37

+0

可能重複[如何從ac函數回調lua函數](http://stackoverflow.com/questions/2688040/how-to-callback-a-lua-function-from-ac-function) – finnw 2011-12-19 20:29:30

+0

看來,問題在於我稱lua_rawgeti的點在我稱爲lua_close(L)之後運行。 – jimt 2011-12-20 06:51:16

回答

0

正如@Schollii提到的,​​我在做了一個lua_close(L)之後做了這個調用。

0

我的第一個建議是讓它在C中根本不存儲函數的情況下工作。只要將你的函數分配給Lua中的全局函數,然後在C中使用Lua狀態(L)來獲取全局變量,推入參數,調用函數並使用結果。一旦這個工作正常,你已經掌握了基本知識,並且知道你的函數正在工作,你可以改變你使用註冊表的方式。祝你好運!

+0

如果你閱讀了評論,你會看到jimt在他完成使用狀態之前調用了'lua_close'。 – BMitch 2012-08-04 01:03:21