在我的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()
内可用?
答案 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 Manual和Programming in Lua。请注意,在线提供的书籍基于Lua 5.0,因此它不是完全最新的,但应足以学习C和Lua之间的交互基础。