Инициализация и присвоение являются двумя отличными операциями, которые, оказывается, используют тот же оператор (" = ") здесь.
Когда вы вызываете lua_next
, вторым аргументом должен быть индекс таблицы. Поскольку вы просто помещаете таблицу в стек с помощью
lua_getglobal(L, "level");
, после этого вызова ваш стек будет выглядеть как
-1: table "level"
(а не +1
, поскольку стек читается вниз). Затем вы вызываете
lua_pushnil(L);
, чтобы ваш стек был
-1: key (nil) -2: table "level"
. Ваша таблица находится в -2
, поэтому, когда вы вызываете lua_next
, вы должны использовать индекс -2
. Наконец, после каждой итерации ваш стек должен выглядеть так:
-1: value -2: key -3: table "level"
Итак, вы хотите прочитать значение (в -1
), а затем вставить его (так что просто нажмите один раз), а затем вызовите lua_next
, чтобы получить следующий ключ. Таким образом, должно сработать что-то вроде этого:
lua_getglobal(L, "level");
lua_pushnil(L);
while(lua_next(L, -2)) { // <== here is your mistake
if(lua_isnumber(L, -1)) {
int i = (int)lua_tonumber(L, -1);
//use number
}
lua_pop(L, 1);
}
lua_pop(L, 1);
Редактировать на основе вашего второго редактирования
Поскольку он работает, когда вы удаляете внешний материал, но не работает, когда вы добавляете его обратно, я предполагаю, что вы каким-то образом повредили стек (либо стек C ++, либо стек lua). Внимательно посмотрите на свои указатели, особенно когда вы манипулируете состоянием lua.
Почему вы делаете лишнее lua_pop (L, 1)
в конце версии из справочника? Я понимаю, почему это может быть проблемой, если вы выскакиваете за пределы глубины стека.