Lua «попытка проиндексировать нулевое значение»

Я пытаюсь зарегистрировать векторный тип в 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 это вызывает саму ошибку). Так что это может быть что угодно, но я не могу понять это.

0

Решение

lua_pop попса N элементы из стека

Но вы написали lua_pop(L, -1) (который очищает весь стек). Измените это на lua_pop(L, 1) совать только верхушку стека.

2

Другие решения


По вопросам рекламы [email protected]