2015-08-03 4 views
0

Я пытаюсь зарегистрировать векторный тип с Lua, но я получаю странную ошибку «попытка индексировать новое значение», когда я вызываю добавление metafunction из Lua ,Lua «попытаться проиндексировать значение nil»

Вот раздел кода. Я не включил никаких других метафайлов (у них одна и та же проблема, единственное отличие - математический оператор, используемый в одной из последних строк). Ошибка, похоже, исходит от функции 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_pushstring' +' lua_settable' = [lua_setfield] (http://www.lua.org/manual/5.2/manual.html#lua_setfield). 'lua_isnil' +' lua_tonumber' = [luaL_optnumber] (http://www.lua.org/manual/5.2/manual.html#luaL_optnumber). 'lua_newtable' +' lua_push ??? '+ ... = [luaL_newlib] (http://www.lua.org/manual/5.2/manual.html#luaL_newlib). 'lua_is ???' + 'luaL_error' = [luaL_check ???] (http://www.lua.org/manual/5.2/manual.html#luaL_checktype). Создайте метатеги один раз (вместе с библиотекой) в реестре (см. [LuaL_newmetatable] (http://www.lua.org/manual/5.2/manual.html#luaL_newmetatable)), а не для всех объектов. – Youka

ответ

Смежные вопросы