Как правильно читать строковые и табличные аргументы с помощью Lua c API? - PullRequest
0 голосов
/ 02 ноября 2018

Я потратил несколько часов, пытаясь заставить его работать без успеха. У меня есть программа на C ++ с функцией, доступной для скрипта Lua. Скрипт Lua использует его так:

    setData('type', {a=1, b=2, c=3})

Итак, первый аргумент - это строка, а второй - таблица.

Моя текущая и лучшая версия функции setData в C ++ выглядит так:

    string sType;
    map<string, uint8_t> mOptions;

    int nArgs = lua_gettop(i_pState);
    if (nArgs == 2)
    {
        if (lua_isstring(i_pState, 1) != 0)
            sType = lua_tostring(i_pState, 1);

        if (lua_istable(i_pState, 2) != 0)
        {
            lua_pushnil(i_pState);
            while(lua_next(i_pState, 2))
            {
                uint8_t nValue = uint8_t(lua_tonumber(i_pState, -1));
                string  sKey   = lua_tostring(i_pState, -2);

                mOptions[sKey] = nValue;

                lua_pop(i_pState, 1);
            }
            lua_pop(i_pState, 1);
        }
    }

    return 0;

Работает нормально, но вызывает ошибку «program.exe сработала точка останова» в конце, когда вызывается функция lua_close(). Что не так с этим кодом?

UPD1. Я не получаю ошибку без обработки второго аргумента.

UPD2. Мой код ведет себя очень странно. Я думаю, что это может быть проблема смешивания extern "C" и кода C ++.

UPD3. Оказывается, это куча коррупции. Я не могу понять, где причина. Вероятно, это не имеет отношения к Луа вообще.

1 Ответ

0 голосов
/ 03 ноября 2018

Наконец-то! Перекомпиляция кода Lua в виде кода C ++ не сработала (положительный момент - мне больше не нужно беспокоиться о extern "C"). Но я нашел два лишних lua_pop() звонка. Я их убрал и теперь работает нормально.

Я не ожидал, что Луа будет таким опасным!

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