Проблема с итерацией lua_isstring для таблицы в таблице - PullRequest
1 голос
/ 10 марта 2020

Я пытаюсь записать таблицу в файл ini , все работало, пока я не добавил строку lua_tostring (L, -2) затем lua_next (L, -2 ) начал выдавать ошибку. Как эта строка может влиять, в моем понимании, я просто беру значение из стека и не более. Как я могу это исправить?

{
    // Push an initial nil to init lua_next
    lua_pushnil(inOutState);
    // Parse the table at index
    while (lua_next(inOutState, -2))
    {
        if (lua_isstring(inOutState, -1)) {
            string key = lua_tostring(inOutState, -2);
            string value = lua_tostring(inOutState, -1);
            inIniTree.put(suffix + key, value);
        }
        else if (lua_istable(inOutState, -1)) {
            suffix += lua_tostring(inOutState, -2); !!!!!! without this line function is working well !!!!!!!
            setDataInIni(inOutState, inIniTree, suffix);
        }

        // Pop value, keep key
        lua_pop(inOutState, 1);
    }
    return;
}

1 Ответ

1 голос
/ 10 марта 2020

lua_tostring() заменяет значение в стеке, если значение не относится к типу string. Это означает, что вы изменили ключ для lua_next(). Вы должны скопировать значение с помощью lua_pushvalue() и затем преобразовать его в строку.

if (lua_isstring(inOutState, -1)) {
  lua_pushvalue(inOutState, -2);
  string key = lua_tostring(inOutState, -1);
  lua_pop(L, 1);
  string value = lua_tostring(inOutState, -1);
  inIniTree.put(suffix + key, value);
}
else if (lua_istable(inOutState, -1)) {
  lua_pushvalue(inOutState, -2);
  suffix += lua_tostring(inOutState, -1);
  lua_pop(L, 1);
  setDataInIni(inOutState, inIniTree, suffix);
}
...