主页 > 知识库 > C调用lua函数需要考虑的问题

C调用lua函数需要考虑的问题

热门标签:地图标注大厦 个人怎么在地图标注需要的店铺 怎么去除地图标注 漳州智云呼电话机器人 新岸线智能电销机器人 冀州市地图标注 武汉外呼防封系统多少钱 百度地图标注早餐区域 清朝地图标注哈尔滨

需要考虑的问题:

1. 使用 lua_pcall 可以调用 lua 函数,首先把 lua 函数入栈,然后把参数入栈, lua_pcall(luaState, 参数个数, 返回值个数, 0) ;
2. 为了在事件触发时回调 lua 函数,需要把 lua 函数保存起来,使用 luaL_ref(luaState, LUA_REGISTRYINDEX) 将位于栈顶的 lua 函数保存到 LUA_REGISTRYINDEX 表里面, LUA_REGISTRYINDEX 是一个全局表, luaL_ref 将返回 lua 函数在 LUA_REGISTRYINDEX 表中的位置 nRef ;
3. 使用 lua_rawgeti(luaState, LUA_REGISTRYINDEX, nRef) 获取之前保存的 lua 函数,nRef 是 lua 函数在 LUA_REGISTRYINDEX 表中的位置, lua 函数将被放到栈顶,这时就可以使用 lua_pcall 调用 lua 函数了;
4. 使用 luaL_unref(luaState, LUA_REGISTRYINDEX, nRef) 可以从 LUA_REGISTRYINDEX 表中删除之前保存的 lua 函数;

示例:

复制代码 代码如下:

int LuaTest::Attach(lua_State* luaState)
{
    if(lua_isfunction(luaState, 1) != 1)
    {
        return 0;
    }
    lua_settop(luaState, 1);
    m_nRef = luaL_ref(luaState, LUA_REGISTRYINDEX);   // 保存到 LUA_REGISTRYINDEX 表
    lua_pushinteger(luaState, nRef);
   
    return 1;
}

int LuaTest::Detach(lua_State* luaState)
{
    m_nRef = luaL_checknumber(luaState, 1);
    luaL_unref(luaState, LUA_REGISTRYINDEX, nRef);    // 从 LUA_REGISTRYINDEX 表中删除
    m_nRef = 0;
   
    return 0;
}

// 事件监听函数
void LuaTest::EventListener(lua_State* luaState)
{
    lua_rawgeti(luaState, LUA_REGISTRYINDEX, m_nRef);  // 从 LUA_REGISTRYINDEX 表中获取
    lua_pushstring(luaState, "参数1");
    lua_pushstring(luaState, "参数2");
    lua_pcall(luaState, 2, 1, 0);               // 调用 lua 函数
    int nRet = luaL_checknumber(luaState, -1);  // 返回值
}

您可能感兴趣的文章:
  • Lua教程(二):基础知识、类型与值介绍
  • Lua实现split函数
  • Lua中if语句嵌套的使用教程

标签:台湾 天门 金昌 宣城 德宏 天门 潍坊 儋州

巨人网络通讯声明:本文标题《C调用lua函数需要考虑的问题》,本文关键词  调用,lua,函数,需要,考虑,;如发现本文内容存在版权问题,烦请提供相关信息告之我们,我们将及时沟通与处理。本站内容系统采集于网络,涉及言论、版权与本站无关。
  • 相关文章
  • 下面列出与本文章《C调用lua函数需要考虑的问题》相关的同类信息!
  • 本页收集关于C调用lua函数需要考虑的问题的相关信息资讯供网民参考!
  • 推荐文章