简体   繁体   English

Lua“尝试索引零值”

[英]Lua “attempt to index a nil value”

I'm trying to register a vector type with Lua, but I'm getting a strange "attempt to index a new value" error when I'm calling the addition metafunction from Lua. 我正在尝试向Lua注册向量类型,但是当我从Lua调用加法元函数时,出现了一个奇怪的“试图索引新值”错误。

Here is the code section involved. 这是涉及的代码部分。 I did not include any other metafunctions (they have the same problem, the only difference is the math operator used in one of the last lines). 我没有包含任何其他元函数(它们有相同的问题,唯一的区别是最后一行中的数学运算符)。 The error seems to come from the static int LuaVector_lua___add(lua_State *L) function. 该错误似乎来自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");
}

It crashes with the code: 它崩溃与代码:

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

I tried to isolate what caused it, but I couldn't determine the actual line that is faulty (though, I believe it's lua_gettable that triggers the error itself). 我试图找出导致问题的原因,但是我无法确定实际的错误行(尽管我相信是lua_gettable触发了错误本身)。 So it could be anything, but I can't seem to figure it out. 因此可以是任何东西,但我似乎无法弄清楚。

lua_pop Pops n elements from the stack lua_pop 从堆栈中 lua_pop n个元素

But you have written lua_pop(L, -1) (which clears the entire stack). 但是您已经编写了lua_pop(L, -1) (清除了整个堆栈)。 Change these to lua_pop(L, 1) to pop just the top of the stack. 将它们更改为lua_pop(L, 1)以仅弹出堆栈的顶部。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM