【问题标题】:Hand over global custom data to Lua-implemented functions将全局自定义数据交给 Lua 实现的函数
【发布时间】:2013-11-22 23:48:53
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我想到的几件事:1. 您是否将轻量级用户数据变量作为参数传递给my_fct_name()(对不起,如果这是一个愚蠢的问题) ? 2. 您是否正在为脚本设置不同的环境(例如沙盒)? 3。你能显示一些代码吗?
  • 不,my_fct_name() 仅从不存在这些(全局)用户数据的 LUA 中调用。用户数据在初始化时可用,它似乎在脚本启动之前必须将它们推送到 LUA 上下文 L。
  • 请发布您的代码lua_touserdata(L, 1) 将函数的第一个参数转换为用户数据。它不适用于任何全局。假设你的全局 luserdata 名称是ud,如果你想让它工作,你需要调用你的函数my_fct_name(ud)。或者在 C 端获取你的全局变量。
  • 可能是我的方法完全错误,所以让我们更通用地问这个问题。我有一个指向初始化期间可用的一些用户数据的指针,这意味着在 LUA 脚本启动之前。现在,当从正在运行的 LUA 脚本中调用 C 函数时,我需要访问这些用户数据。由于 C 函数始终定义为 int my_lua_called_c_fct(lua_State *L) ,因此只有 L 可以从中获取这些用户数据。但是如何在初始化期间将数据放入 L 以及如何在该函数中检索它们?
  • 阅读我的编辑以了解 Lua C API。

标签: lua lua-userdata


【解决方案1】:

既然你拒绝提供你的代码,这根本没有帮助,让我举个例子。

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 之间交互的基础知识应该足够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-06
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 2022-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多