关于c ++:Lua“试图索引一个nil值”

Lua “attempt to index a nil value”

我正在尝试向Lua注册向量类型,但是当我从Lua调用附加元函数时,出现了一个奇怪的"试图为新值建立索引"错误。

这是涉及的代码部分。 我没有包含任何其他元函数(它们有相同的问题,唯一的不同是最后一行中的数学运算符)。 该错误似乎来自static int LuaVector_lua___add(lua_State *L)函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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");
}

它崩溃与代码:

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

我试图找出导致问题的原因,但我无法确定实际的错误行(尽管,我相信是lua_gettable触发了错误本身)。 因此可以是任何东西,但我似乎无法弄清楚。


lua_pop从堆栈中弹出n个元素

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