Итерация через таблицу Lua от C++?

Инициализация и присвоение являются двумя отличными операциями, которые, оказывается, используют тот же оператор (" = ") здесь.

19
задан ks1322 9 March 2013 в 18:08
поделиться

2 ответа

Когда вы вызываете 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.

28
ответ дан 30 November 2019 в 04:12
поделиться

Почему вы делаете лишнее lua_pop (L, 1) в конце версии из справочника? Я понимаю, почему это может быть проблемой, если вы выскакиваете за пределы глубины стека.

0
ответ дан 30 November 2019 в 04:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: