【问题标题】:Using Lua from C++, Fails to open standard libs with Nil error使用 C++ 中的 Lua,无法打开标准库并出现 Nil 错误
【发布时间】:2019-09-20 12:12:21
【问题描述】:

我一直在将 Lua 集成编写到游戏项目中,令人沮丧的是,每次我尝试使用 lua_pcall 时,都会收到错误“尝试调用 nil 值”。

当我尝试查找错误时,大多数示例都是关于在加载他们的 lua 文件后忘记使用 pcall 的人,或者是一些错误。但对我来说,只要我尝试加载 lua 标准库。我不明白为什么要显示这么少的代码出了什么问题。我尝试过的其他事情是跳过 openLibs 并直接使用 doFile 加载我的文件,但即使在这种情况下,我所做的任何事情都会导致 nil 错误。

非常感谢任何帮助。

编辑:

感谢一些帮助,我确定我不需要为 luaL_openlibs 执行 pcall,但正如我在上面所写的,尝试运行任何函数都会导致错误。在这种情况下,它在全局 lua 命名空间中找不到“init”

c++

void LuaScriptingInterface::init()
{
    m_luaState = std::shared_ptr<lua_State>(luaL_newstate());

    luaL_openlibs(m_luaState.get());

    if (luaL_dostring(m_luaState.get(), m_script.c_str())) // script below
    {
        const char* errStr = lua_tostring(m_luaState.get(), -1);
        ASSERT(false, errStr ); // not hitting this case
    }

    lua_getglobal(m_luaState.get(), "init");
    if (!lua_isfunction(m_luaState.get(), -1))
    {
        ASSERT(false); // hit this case! Why can't we find "init"?
    }
}

lua

init function ()

end

update function (dt)

end

当然它还没有做任何事情,但我希望它至少应该能够找到函数。

【问题讨论】:

  • 看起来你实际上并没有在堆栈上放置一个要调用的函数?!
  • 哦! luaL_openlibs 不会将 lib 函数放在堆栈上吗?也许我只是误解了它是如何工作的。
  • 您如何解释the documentation,尤其是+0
  • 是说不会改变栈位置吗?
  • 正确。如果你没有改变堆栈位置,那么你就没有向堆栈添加任何东西!

标签: c++ lua scripting


【解决方案1】:

问题出在我的 FileReader 代码中,有一个省略的换行符

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    相关资源
    最近更新 更多