Lua“尝试对nil值进行索引”

我正在尝试在 Lua 中注册一个向量类型,但是在我从 Lua 调用加法元方法时却得到了一个奇怪的“试图索引一个新值”的错误。

下面是涉及的代码部分。我没有包含任何其他元方法(它们都有同样的问题,唯一的区别是最后一行使用的数学运算符不同)。错误似乎来自 static int LuaVector_lua___add(lua_State *L) 函数。

static void LuaVector_pushVector(lua_State *L, double x, double y)
{
    lua_newtable(L);

    lua_pushstring(L, "x");
    lua_pushnumber(L, x);
    lua_settable(L, -3);

    lua_pushstring(L, "y");
    lua_pushnumber(L, y);
    lua_settable(L, -3);

    lua_newtable(L);

    lua_pushstring(L, "__add");
    lua_pushcfunction(L, LuaVector_lua___add);
    lua_settable(L, -3);

    lua_setmetatable(L, -2);
}

static int LuaVector_lua___add(lua_State *L)
{
    if (!lua_istable(L, 1))
        luaL_error(L, "Table excepted for argument #1 LuaVector_lua___add");
    if (!lua_istable(L, 2))
        luaL_error(L, "Table excepted for argument #2 LuaVector_lua___add");

    double x1=0, y1=0, x2=0, y2=0;

    /* The error occurs somewhere between here */

    lua_pushstring(L, "x");
    lua_gettable(L, 1);
    x1 = lua_tonumber(L, -1);
    lua_pop(L, -1);

    lua_pushstring(L, "y");
    lua_gettable(L, 1);
    y1 = lua_tonumber(L, -1);
    lua_pop(L, -1);

    lua_pushstring(L, "x");
    lua_gettable(L, 2);
    x2 = lua_tonumber(L, -1);
    lua_pop(L, -1);

    lua_pushstring(L, "y");
    lua_gettable(L, 2);
    y2 = lua_tonumber(L, -1);
    lua_pop(L, -1);

    /* And here */

    LuaVector_pushVector(L, x1 + x2, y1 + y2);

    return 1;
}

int LuaVector_lua_new(lua_State *L)
{
    double x = 0;
    if (!lua_isnil(L, 1))
        x = lua_tonumber(L, 1);

    double y = 0;
    if (!lua_isnil(L, 2))
        y = lua_tonumber(L, 2);

    LuaVector_pushVector(L, x, y);

    return 1;
}

void LuaVector_luaregister(lua_State *L)
{
    lua_newtable(L);

    lua_pushstring(L, "new");
    lua_pushcfunction(L, LuaVector_lua_new);
    lua_settable(L, -3);

    lua_setglobal(L, "Vector");
}

它会在以下代码崩溃:

local vec1 = Vector.new(2, 2)
local vec2 = Vector.new(4, 4)
local vec3 = vec1 + vec2

我试图隔离导致问题的原因,但是我无法确定真正出问题的行(尽管我相信是 lua_gettable 触发了错误本身)。因此,它可能是任何东西,但我似乎无法找出它。

点赞
用户2726734
用户2726734

[lua_pop 从栈中弹出 n 个元素] (http://www.lua.org/manual/5.1/manual.html#lua_pop)

但您已经写了 lua_pop(L, -1)(它清除整个栈)。请将它们更改为 lua_pop(L, 1) 以仅弹出栈顶。

2015-08-03 16:58:30