C++&;Lua-尝试索引零值错误 我目前正在学习如何使Lua与C++结合,我偶然发现了这个问题。 以下是我目前正在使用的小应用程序: #include <lua.5.2.3\src\lua.hpp> #include <iostream> #include <string> int pluacall(lua_State *L){ std::cout << "Called from inside Lua." << std::endl; return 0; } int main(){ std::string x; lua_State *L = luaL_newstate(); luaL_openlibs(L); luaL_Reg _funcs[] = { { "CppFunc", pluacall }, {} }; if (luaL_dofile(L, "test.lua")){ std::cout << "Error: " << lua_tostring(L, -1) << std::endl; lua_pop(L, 1); } luaL_setfuncs(L, _funcs, 0); lua_getglobal(L, "sup"); if (lua_pcall(L, 0, 0, 0)){ std::cout << "Error: " << lua_tostring(L, -1) << std::endl; lua_pop(L, 1); } std::cout << "Test"; std::getline(std::cin, x); lua_close(L); return 0; }

C++&;Lua-尝试索引零值错误 我目前正在学习如何使Lua与C++结合,我偶然发现了这个问题。 以下是我目前正在使用的小应用程序: #include <lua.5.2.3\src\lua.hpp> #include <iostream> #include <string> int pluacall(lua_State *L){ std::cout << "Called from inside Lua." << std::endl; return 0; } int main(){ std::string x; lua_State *L = luaL_newstate(); luaL_openlibs(L); luaL_Reg _funcs[] = { { "CppFunc", pluacall }, {} }; if (luaL_dofile(L, "test.lua")){ std::cout << "Error: " << lua_tostring(L, -1) << std::endl; lua_pop(L, 1); } luaL_setfuncs(L, _funcs, 0); lua_getglobal(L, "sup"); if (lua_pcall(L, 0, 0, 0)){ std::cout << "Error: " << lua_tostring(L, -1) << std::endl; lua_pop(L, 1); } std::cout << "Test"; std::getline(std::cin, x); lua_close(L); return 0; },c++,visual-c++,lua,visual-studio-2013,C++,Visual C++,Lua,Visual Studio 2013,尝试显式设置终止funcs数组的哨兵: luaL_Reg _funcs[] = { { "CppFunc", pluacall }, {NULL, NULL} }; 我不认为编译器会给它们默认的0值(但我不是100%),所以如果不设置它们,可能会导致垃圾指针崩溃 在评论后编辑上述内容没有帮助: 如果不是这个问题,请尝试使用luaL_newlib而不是luaL_setfuncs:它似乎使用luaL_newlibtable在堆栈上创建一个表,然后调用setfuncs在其中注册函数: luaL_ne

尝试显式设置终止funcs数组的哨兵:

luaL_Reg _funcs[] = { { "CppFunc", pluacall }, {NULL, NULL} };
我不认为编译器会给它们默认的0值(但我不是100%),所以如果不设置它们,可能会导致垃圾指针崩溃

在评论后编辑上述内容没有帮助:

如果不是这个问题,请尝试使用luaL_newlib而不是luaL_setfuncs:它似乎使用luaL_newlibtable在堆栈上创建一个表,然后调用setfuncs在其中注册函数:

luaL_newlib(L, _funcs);

(我感到惊讶的是,要找到关于这一点的清晰文档/示例是多么困难)。看这个

所以我并没有完全按照我的想法解决这个问题,但是总比什么都没有好

我将
luaL\u setfuncs()
更改为
lua\u register()
,现在一切似乎都正常了。出了什么问题?我不知道

我认为
Lua\u setfuncs()
是现在使用Lua注册C函数的首选方法,但它不起作用,所以我必须坚持通过
Lua\u register()注册所有函数

如果我得到更多关于这个问题的信息,我会编辑这篇文章

void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup);
将数组l中的所有函数(请参见luaL_Reg)注册到堆栈顶部的表中(在可选upvalues下面,请参见下一步)


创建一个新表,并在其中注册列表l中的函数。它的实现方式如下所示:

 (luaL_newlibtable(L,l), luaL_setfuncs(L,l,0))

luaL\u setfuncs
之前插入
luaL\u newlibtable(L,\u funcs)
,或者改用
luaL\u newlib(L,\u funcs)
。如果您不想将函数注册到单独的表中,而是注册到全局命名空间中,可以使用以下方法:

lua_pushvalue(L, LUA_GLOBALSINDEX); // push _G table
luaL_setfuncs(L, _funcs, 0); // set funcs on _G
lua_pop(L, 1); // pop _G

这是我尝试过的事情之一,而且。。。这没用不,事情不是这样的。聚合初始化将多余的元素初始化为“0”(算术类型初始化为0,指针初始化为
nullptr
,就好像它们是
static
)。请重新阅读luaL_setfuncs的文档。它不会将函数放入全局表中;您需要在堆栈顶部有一个表,以便写入。我是否应该先创建该表,然后调用
luaL\u setfuncs()
?文档非常模糊,我甚至找不到关于
luaL_setfuncs()
的示例。您是否发现
luaL_setfuncs
的描述中有一个特别的部分让您感到困惑?@Seth基于文档,我想您可能必须使用newlib查看我编辑过的答案,
lua_register
没有问题,如果您需要“只导出一个函数”。
 (luaL_newlibtable(L,l), luaL_setfuncs(L,l,0))
lua_pushvalue(L, LUA_GLOBALSINDEX); // push _G table
luaL_setfuncs(L, _funcs, 0); // set funcs on _G
lua_pop(L, 1); // pop _G