Ошибка в работе со стеком LUA из C++

178
02 февраля 2018, 22:17

Приветствую. Работаю со скриптом LUA и C++. Суть проблемы в том, что данные из Lua скрипта не попадают в стек, или С++ неверно со стеком работает. Подробнее, вот скрипт работающий на LUA машине :

require("QluaConnector");
is_run=true;
function main()
while is_run == true do
for i = 1, 3, 1 do
-- print(tostring(i));   -- такой вывод на экран срабатывает верно
QluaConnector.StartSendData(i);  -- а этот уже нет
sleep(1000);
end;
end
end;

Единственное что мне нужно так это последовательно передавать в стек и читать из него три цифры : 1, 2, 3.

Код на С++ :

static int forLua_StartDataGet(lua_State *L) 
{
while (true)
    {
    int value = lua_tonumber(L, 1);
    lua_pop(L,-1);
    Sleep(1000);
    return(value );
    }
}

В первый раз метод действительно возвращает 1, однако вместо 2 и 3 уже ноль. Если вместо lua_tonumber посмотреть число элементов в стеке lua_gettop то в 1 раз функция вернет 1 а во второй и дальнейшие по 0. Подозреваю, что ошибка или в скрипте или в С++, помогите разобраться.

Answer 1

В return нужно возвращать не значение, а число значений, возвращаемых функцией. В Lua функция может вернуть несколько значений. Само же возвращаемое значение, предварительно заносится в стек. Ну и lua_pop тут вообще не нужен.

static int forLua_StartDataGet(lua_State *L) 
{
    int value = lua_tonumber(L, 1);
    lua_pushinteger(L, value); // положить результат в стек
    return 1; // говорим lua, что вернули одно значение на стеке   
}

Если функция не должна ничего возвращать, то код становится ещё проще:

static int forLua_StartDataGet(lua_State *L) 
{
    int value = lua_tonumber(L, 1);
    ... // используем value
    return 0; // говорим lua, что наша функция ничего не возвращает
}
Answer 2

Функция lua_pop принимает на вход количество элементов, которые надо убрать со стека. Соответственно это число должно быть положительным.

lua_pop(L, 1);
READ ALSO
Периодически вызываемый GetProcessTime выдаёт одно и то же значение

Периодически вызываемый GetProcessTime выдаёт одно и то же значение

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

178
QPushButton - подсветка при наведении - не работает в винде

QPushButton - подсветка при наведении - не работает в винде

Для QPushButton задаю иконку с 3мя установленными картинками: Normal, Disabled, ActiveПосле сборки и запуска на linux, всё отрабатывает как ожидается - при наведении...

173
Синхронная обработка запросов через boost::asio

Синхронная обработка запросов через boost::asio

Первая итерация срабатывает превосходно, ввожу строку - получаю ответ, а второй раз как бы "зависает" - те

201