【问题标题】:Calling a lua function from table.subtable in C++从 C++ 中的 table.subtable 调用 lua 函数
【发布时间】:2012-07-14 08:11:34
【问题描述】:

我试图从 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 时出现不受保护的错误(尝试索引 nil 值)

在第 3 行:lua_getfield(L, -1, "hello");

我错过了什么?

附带问题:我也很想知道如何调用比这更深的函数 - 例如 globaltable.subtable.subsubtable.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?

【问题讨论】:

    标签: c++ function lua lua-table


    【解决方案1】:

    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
    

    【讨论】:

    • function globaltable.subtable.function() 应该只是为了定位 - 让我们假设它的“function globaltable.subtable.hello()”
    • 那么我的第二点适用。看起来在 globaltable 中找不到 subtable。尝试创建一个 Lua stackDump 函数来显示堆栈的内容,并在每次 Lua 操作后调用它。
    • 我已经编辑了上面的问题 - 我在 C++ 中创建了这个全局表,但我不知道如何在全局表中创建子表
    【解决方案2】:
    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");
    

    这就是我要找的。​​p>

    【讨论】:

      猜你喜欢
      • 2014-09-01
      • 1970-01-01
      • 2013-02-19
      • 2015-12-30
      • 2022-01-04
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多