2011-12-19 54 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