Доступ к таблице Lua в таблице со стороны C ++ - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь перенести таблицу, в которой могут быть вложенные таблицы из lua и записать в файл .ini . Но я просто не могу, как мне нужно go в стеке, чтобы получать данные из вложенных таблиц. Этот код не работает как следует. Функция setData работает не правильно. В чем может быть проблема?

C ++ код

int sasl::LuaUtilities::luaWriteIni(LuaState inOutState)
{   
    string path;
    boost::property_tree::ptree iniTree;
    LUA_CHECK_NARG_EQ(inOutState, 2);
    LUA_GET_PARAM(inOutState, 1, path);
    int nargs = lua_gettop(inOutState);
    for (int i = 1; i <= nargs; i++) {
        if (lua_istable(inOutState, nargs)) {
            setData(inOutState, nargs, iniTree);
        }
    }
    return 0;
}

void sasl::LuaUtilities::setData(LuaState inOutState, int index, boost::property_tree::ptree & inIniTree)
{
    // Push an initial nil to init lua_next
    lua_pushnil(inOutState);
    // Parse the table at index
    while (lua_next(inOutState, index))
    {
        if (lua_istable(inOutState, index))
        {
            setData(inOutState, index, inIniTree);
        }
        else
        {
            string key = lua_tostring(inOutState, -2);
            string value = lua_tostring(inOutState, -1);
        }
        // Pop value, keep key
        lua_pop(inOutState, 1);
    }
    return;
}

Lua код

t = {}
local fileName = findResourceFile("test.ini")
t = readINI(fileName)
writeINI(fileName, t) --this not work in c++ side

1 Ответ

0 голосов
/ 02 марта 2020

Есть две проблемы. lua_istable(inOutState, index) неверно, поскольку index не является значением ключа, полученного с помощью next. Этот индекс всегда является таблицей, по которой вы перебираете. Таким образом, вы будете бесконечно рекурсировать по одной и той же таблице, когда вы будете вызывать setData с этим индексом.

Фактически, передача index в setData сама по себе почти наверняка неправильна. Или, по крайней мере, это, вероятно, не правильно. Здесь вы хотите использовать относительные индексы, но вызов next помещает дополнительное значение в стек.

То, что вы, вероятно, хотите сделать, - это setData предположить, что таблица для перебора имеет индекс -1 (ie: вершина стека). Таким образом, вы просто звоните lua_next(state, -2) (это -2, потому что ключ для получения следующего находится сверху). И когда вы рекурсивно вызываете setData для табличного значения, вам не нужно указывать индекс, потому что табличное значение уже находится на вершине стека.

Вторая проблема заключается в том, что вы никогда не пишете пары ключ / значение. Вы также никогда не проверяете, является ли значение чем-то, что может быть преобразовано в строку. Это могут быть Lua userdata.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...