Можете ли предложить способы увеличения размера стека ?
Спасибо.
Пасхалочка для Алексея Иванникова:
Пользователь
Сообщений: Регистрация: 30.01.2015
31.08.2016 20:08:04
А разве это не верно: Для получения размера стека используйте функцию . Для вызова из Lua кода на C необходимо иметь в наличии свободной памяти по крайней мере на LUA_MINSTACK позиций стека. LUA_MINSTACK по умолчанию равно 20. Если размера стека не хватает, его можно увеличить функцией .
Пользователь
Сообщений: Регистрация: 30.01.2015
31.08.2016 20:22:21
Николай, в моем понимании, апишный стек и стек среды lua - это вещи разные.
lua_checkstack изменяет размер области обмена в случае вызова апишных функций и только. На исполнение натив луа кода эта функция никак не влияет.
Меня же интересует, в частности, вложенность натив луа функций, в том числе рекурсии. Рекурсия в 20 уровней - это слишком грустно.
Если я ошибаюсь в своих воззрениях - буду рад ошибиться.
Пасхалочка для Алексея Иванникова:
Пользователь
Сообщений: Регистрация: 30.01.2015
31.08.2016 20:36:31
Оказывается, Lua содержит оптимизатор хвостовой рекурсии, так что при некотором умственном напряжении в вопросе рекурсии можно найти выход.
Пасхалочка для Алексея Иванникова:
Пользователь
Сообщений: Регистрация: 30.01.2015
01.09.2016 06:31:10
полагаю, что число рекурсий ограничено лишь объемом свободной памяти кучи .
Пользователь
Сообщений: Регистрация: 30.01.2015
01.09.2016 06:32:39
Вызов в форме return functioncall называется концевым вызовом. Lua также поддерживает концевой вызов «себя» (или рекурсивный концевой вызов): в этом случае вызванная функция использует стек вызывающей функции. Поэтому количество вложенных концовых вызовов может быть любым. Заметим только, что концевой вызов стирает отладочную информацию о вызывающей функции.
Lua uses a virtual stack to pass values to and from C. Это дела С API.
Пасхалочка для Алексея Иванникова:
Пользователь
Сообщений: Регистрация: 27.01.2016
03.09.2016 15:47:29
Цитата
написал: Меня же интересует, в частности, вложенность натив луа функций, в том числе рекурсии. Рекурсия в 20 уровней - это слишком грустно.
То, что LUA_MINSTACK = 20 ничего не значит, т.к. LUA_MINSTACK - это минимальный выделенный размер стека Lua на момент вызова пользовательской Си-функции.
Согласно Количество вложенных в друг друга функций (и Си-функций и Lua-функций) в Lua - это LUA_MAXCALLS = 4096, из них может быть только LUA_MAXCCALLS = 200 вызовов пользовательских Си-функций (всякие SearchItems и т.п.)
не совсем то, так как QLUA на основе Lua 5.1 в которой /* @@ limits the number of nested calls. ** CHANGE it if you need really deep recursive calls. This limit is ** arbitrary; its only purpose is to stop infinite recursion before ** exhausting memory. */ #define LUAI_MAXCALLS 20000 /* @@ limits the number of Lua stack slots that a C function @* can use. ** CHANGE it if you need lots of (Lua) stack space for your C ** functions. This limit is arbitrary; its only purpose is to stop C ** functions to consume unlimited stack space. (must be smaller than ** -) */ #define LUAI_MAXCSTACK 8000