【问题标题】:Calling Lua from C从 C 调用 Lua
【发布时间】:2011-12-19 05:03:29
【问题描述】:

我正在尝试从 C 调用用户定义的 Lua 函数。我已经看到了一些关于此的讨论,并且解决方案似乎很清楚。我需要用 luaL_ref() 抓取函数的索引,并保存返回的索引以备后用。

在我的例子中,我使用 luaL_ref 保存了该值,并且我的 C 代码需要调用使用 luaL_ref 保存的 Lua 函数。为此,我使用 lua_rawgeti 如下:

lua_rawgeti(l, LUA_REGISTRYINDEX, fIndex);

这会导致 lua_rawgeti 崩溃。

我使用的 fIndex 是我从 luaL_ref 收到的值,所以我不确定这里发生了什么。

编辑:

我正在运行如下 Lu​​a 脚本:

function errorFunc()
  print("Error")
end

function savedFunc()
  print("Saved")
end

mylib.save(savedFunc, errorFunc)

我用 C 函数定义了我自己的 Lua 库“mylib”:

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);

导致崩溃的原因。

【问题讨论】:

  • 为了回答这个问题,我们需要看看你从哪里得到你试图调用的“用户定义的 Lua 函数”,以及你如何在注册表中存储它。
  • 看来问题在于我调用 lua_rawgeti 的点是在我调用 lua_close(L) 之后运行的。
  • 在调用 lua_close(L) 后,任何情况下都不要在 lua_State L 上使用 Lua C api ;)
  • @jimt 我建议自己回答或删除,这样问题就不会保持开放。

标签: lua


【解决方案1】:

我的第一个建议是让它工作而不用将函数存储在 C 中。只需将您的函数分配给 Lua 中的全局,然后在 C 中使用 Lua 状态 (L) 获取全局,推送参数,调用函数并使用结果。一旦它起作用了,你就掌握了基础知识并且知道你的函数正在运行,你可以改变你在函数中使用注册表的方式。祝你好运!

【讨论】:

  • 如果你阅读了 cmets,你会看到那个 jimt 在他使用完状态之前调用了lua_close
【解决方案2】:

正如@Schollii 所提到的,我是在执行 lua_close(L) 之后进行此调用的。

【讨论】:

    猜你喜欢
    • 2014-09-01
    • 2013-02-19
    • 2015-12-30
    • 2022-01-04
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多