将全局自定义数据交给Lua实现的函数处理。

在我的 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() 中可用?

点赞
用户2198692
用户2198692

既然你拒绝提供你的代码,这完全没有帮助,让我提供一个例子。

设置 Lua 状态(C 端):

lua_State *L = luaL_newstate();

// 将用户数据作为全局变量
lua_pushlightuserdata(L, mypointer);
lua_setglobal(L, "mypointer");

// 设置我的函数
lua_pushcfunction(L, my_fct_name);
lua_setglobal(L, "my_fct_name");

// 载入你的脚本-    luaScript 是一个以 null 结尾的 const char* 缓冲区,里面是我的脚本
luaL_loadstring(L, luaScript);

//    调用脚本(无错误处理)
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);
    //做一些操作
    return 0;
}

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

int my_fct_name(lua_State *L)
{
    lua_getglobal(L, "mypointer");
    void *myPtr = lua_touserdata(L, -1);  //从栈的顶部获取它
    //做一些操作
    return 0;
}

看一看Lua 参考手册和[在 Lua 中编程](http://www.lua.org/pil/24.html)。注意,这本在线书籍基于 Lua 5.0,因此它并不完全更新,但应该足以学习介于 C 和 Lua 之间的基础知识。

2013-05-23 13:30:52