1 (2022-10-05 22:27:35 отредактировано Serg_)

Тема: Что то непонятно с вызовом Lua функций из C++

Подскажите пожалуйста, что то я вдруг понял, что не понял, как вызывается Lua функция из C++.


Предположим вот есть такой скрипт в Квике:


function my_func_Lua(msg)

message(msg)

end

В С++ такой код:

static int forLua_my_func_TEST(lua_State* L)
{

    int size_stack = lua_gettop(L);
    std::cout << "size_1:" << size_stack << std::endl;    //0

    lua_getglobal(L, "my_func_Lua");

    int size_stack = lua_gettop(L);
    std::cout << "size_2:" << size_stack << std::endl;   //1

    lua_pushstring(L, "1");

    int size_stack = lua_gettop(L);
    std::cout << "size_3:" << size_stack << std::endl;   //2

    int status = lua_pcall(L, 1, 0, 0);

    int size_stack = lua_gettop(L);
    std::cout << "size_4:" << size_stack << std::endl;  //0
    
        return 0;
}

1)А теперь вопрос: почему этот код сработал ?
Ведь в lua_pcall - я указал только один аргумент, а по факту их два: это сама функция, которая добавилась на стек вызовов lua_getglobal и второй аргумент строка "1".

Но это сработало и функция my_func_Lua - вызвалась и вывело переданное значение.

2)Почему после вызова lua_pcall - размер стека - стал равен нулю, если после вызова lua_pcall - должен удалять аргумента со стека в кол-ве указанных в функции lua_pcall  переданных аргументов ? Теоретически - размер стека должен был стать - 1 - где этот один - это функция my_func_Lua.


Что то не понятно совсем.

2

Re: Что то непонятно с вызовом Lua функций из C++

Если кратко ответить на ваши вопросы, то все так, как написано в документации.
[url]https://www.lua.org/pil/25.2.html[/url]

1) Потому что вторым аргументом lua_pcal передается количество аргументов функции, а не количество элементов стека. Это прямо написано в документации:

You call lua_pcall with the number of arguments you are passing

2) Потому что так задумана и описана в документации работа функции lua_pcal:

Before pushing the results, lua_pcall removes from the stack the function and its arguments.

Т.е. lua_pcall удалит из стека функцию и переданные в нее аргументы перед возвратом, на стеке останутся только результаты (если они возвращены).

3

Re: Что то непонятно с вызовом Lua функций из C++

Кстати, документация переведена и на русский. Правда только документация
[url]http://lua.org.ru/contents_ru.html[/url]