将全局自定义数据移交给Lua实现的功能

时间:2013-05-23 12:22:41

标签: lua lua-userdata

在我的Lua应用程序中,我有一些自定义的函数已在lua_register("lua_fct_name","my_fct_name")注册,以便Lua脚本知道它们。

现在我有一些需要在my_fct_name()内访问的自定义/用户数据。它只是指向我自己管理的内存区域的指针,因此我使用lua_pushlightuserdata (L,data)将其添加到Lua上下文中。

现在看来我没有正确的位置来添加这些数据。在L创建后立即完成时,我无法访问my_fct_name()中的数据,此处lua_touserdata(L,1)确实返回NULL,因此它在堆栈中不可用。在lua_pcall()执行脚本之前完成时,我收到有关意外数据的错误消息。

那么我必须在何时/何时设置我的用户数据,以便它们在my_fct_name()内可用?

1 个答案:

答案 0 :(得分:3)

由于您拒绝提供完全没有帮助的代码,请举例说明。

Lua州(C侧)的设置:

lua_State *L = luaL_newstate();

//Set your userdata as a global
lua_pushlightuserdata(L, mypointer);
lua_setglobal(L, "mypointer");

//Setup my function
lua_pushcfunction(L, my_fct_name);
lua_setglobal(L, "my_fct_name");

//Load your script - luaScript is a null terminated const char* buffer with my script
luaL_loadstring(L, luaScript);

//Call the script (no error handling)
lua_pcall(L, 0, 0, 0);

Lua代码V1:

my_fct_name(mypointer)

Lua代码V2:

my_fct_name()

在V1中你会得到这样的指针,因为你将它作为参数提供:

int my_fct_name(lua_State *L)
{
    void *myPtr = lua_touserdata(L, 1);
    //Do some stuff
    return 0;
}

在V2中,你必须从全局表中获取它(这也适用于V1)

int my_fct_name(lua_State *L)
{
    lua_getglobal(L, "mypointer");
    void *myPtr = lua_touserdata(L, -1);  //Get it from the top of the stack
    //Do some stuff
    return 0;
}

查看Lua Reference ManualProgramming in Lua。请注意,在线提供的书籍基于Lua 5.0,因此它不是完全最新的,但应足以学习C和Lua之间的交互基础。