在C++中从表调用lua函数

Calling a lua function from table.subtable in C++

本文关键字:调用 lua 函数 C++      更新时间:2023-10-16

im试图从C++中调用一个lua函数,该函数位于全局表的子表中。我使用的是源代码编译的lua 5.2.*版本。

Lua函数

function globaltable.subtable.hello()
 -- do stuff here
end

C++代码

lua_getglobal(L, "globaltable");
lua_getfield(L, -1, "subtable");
lua_getfield(L, -1, "hello");
if(!lua_isfunction(L,-1)) return;
    lua_pushnumber(L, x);
    lua_pushnumber(L, y);
    lua_call(L, 2, 0);

然而,我无法调用它,我总是得到一个错误

PANIC:调用Lua API时出现未受保护的错误(试图对零值进行索引)

第3行:lua_etfield(L,-1,"你好")

我缺少什么

附带问题:我也想知道如何调用比这更深层次的函数,比如globaltable.subtable.subbtable.hello()等等。

谢谢!


这就是我用来创建全局表的东西:

int lib_id;
lua_createtable(L, 0, 0);
lib_id = lua_gettop(L);
luaL_newmetatable(L, "globaltable");
lua_setmetatable(L, lib_id);
lua_setglobal(L, "globaltable");

如何创建globaltable.subtable?

function是Lua中的一个关键字,我猜你是如何编译代码的:

-- test.lua
globaltable = { subtable = {} }
function globaltable.subtable.function()
end

运行时:

$ lua test.lua
lua: test.lua:2: '<name>' expected near 'function'

也许您更改了这个在线演示的标识符,但请检查第2行的"subtable"是否确实存在于globaltable中,因为在第3行,堆栈的顶部已经是nil

更新:

要创建多级表,可以使用以下方法:

lua_createtable(L,0,0); // the globaltable
lua_createtable(L,0,0); // the subtable
lua_pushcfunction(L, somefunction);
lua_setfield(L, -2, "somefunction"); // set subtable.somefunction
lua_setfield(L, -2, "subtable");     // set globaltable.subtable
lua_newtable(L);
luaL_newmetatable(L, "globaltable");
lua_newtable(L); //Create table
lua_setfield(L, -2, "subtable"); //Set table as field of "globaltable"
lua_setglobal(L, "globaltable");

这就是我想要的。