簡體   English   中英

Lua“嘗試索引零值”

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

我正在嘗試向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觸發了錯誤本身)。 因此可以是任何東西,但我似乎無法弄清楚。

lua_pop 從堆棧中 lua_pop n個元素

但是您已經編寫了lua_pop(L, -1) (清除了整個堆棧)。 將它們更改為lua_pop(L, 1)以僅彈出堆棧的頂部。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM