【发布时间】: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? -
是说不会改变栈位置吗?
-
正确。如果你没有改变堆栈位置,那么你就没有向堆栈添加任何东西!