Аргументы Lua в неправильном месте памяти

При разборе переменных из lua lua ведет себя странно.

C++:

int LuaManager::SetTimer(lua_State *pLua)
{
    if (!lua_isstring(pLua, 0)) throw "expected: string";
    if (!lua_isnumber(pLua, 1)) throw "expected: number";

    std::string callback = lua_tostring(pLua, 0);
    double delay = lua_tonumber(pLua, 1);
    Timer timer = Timer(callback, delay);

    return 0;
}

Луа:

SetTimer("Durp", 10);

Я получаю «исключение первого шанса в 0x76C44598: исключение Microsoft C++: char в ячейке памяти 0x00D7F588» из строки

std::string callback = lua_tostring(pLua, 0);

Когда я отлаживаю код и нажимаю «Продолжить», когда появляется исключение, оно бросает случайные переменные в переменную. То же самое касается double delay.

Однако когда я говорю:

std::string callback = lua_tostring(pLua, -2);
double delay = lua_tonumber(pLua, -1);

Он по-прежнему будет выдавать исключение, но будут добавлены правильные переменные.


person R4VANG3R    schedule 18.01.2015    source источник
comment
Если возникнет исключение, переменная наверняка не будет содержать допустимого значения.   -  person Captain Obvlious    schedule 18.01.2015
comment
0 никогда не является допустимым слотом стека. Первый слот стека равен 1.   -  person Colonel Thirty Two    schedule 19.01.2015
comment
О, вы совершенно правы, такая глупая моя оплошность. Есть идеи, почему -1 и -2 также возвращали правильные значения?   -  person R4VANG3R    schedule 19.01.2015
comment
Отрицательные индексы считаются сверху вниз по стеку.   -  person lhf    schedule 19.01.2015
comment
Интересно, поймала бы это компиляция lua с LUA_USE_APICHECK.   -  person greatwolf    schedule 19.01.2015


Ответы (1)


Из моих воспоминаний линия

std::string callback = lua_tostring(pLua, 0);

должно быть

std::string callback = lua_tostring(pLua, 1);

потому что индексы в lua начинаются с 1.

person vincentp    schedule 19.01.2015