Здравствуйте
у меня достаточно много функций, которые я не хотел бы искать каждый раз, когда они потребуются)))
можно ли сохранить один раз эти функции, а потом класть в стек и запускать?
заранее спасибо за возможные ответы)
sergiokey
> ...а потом класть в стек и запускать?
А зачем запускать функцию через стек, когда можно по зарегистрированному имени
int myfunction(int param) { //что-нибудь... } //где-то в коде... lua_register( lua, "myfunction", myfunction); luaL_dostring( lua, "myfunction(333)"); //...
Вообще то вернее будет так:
static int MyFuinction( lua_State* L ) { int val = lua_tonumber(L, -1); //что-нибудь return 1; }; //где-то в коде... lua_register(lua, "myfunction", myfunction); luaL_dostring(lua, "myfunction(333)"); //...
xapac
> Вообще то вернее будет так:...
ОПС!)) Ну я что-то загнался, просто не этим занят щас - давно не писал скриптов
vater
> А зачем запускать функцию через стек, когда можно по зарегистрированному имени
только мы придем к тому же, да еще луа будет строку парсить, а я как раз пытаюсь от этого уйти:
у меня и так уже более оптимизированный вариант - ищу через getstate и запускаю, только закопаны они у меня, поэтому хотелось бы как то это проинициализировать, а потом когда надо - запускать без поиска по какому нибудь идентификатору либо поинтеру
а любопытная идея - запускать функции прямо из стека. Исключает поиск по имени. Хотя конечно выигрыш по производительности несколько сомнительный, но мало ли.
Вроде бы нужное заклинание выглядит примерно так:
lua_pushcfunction(lua,myfunction); // argc - количество аргументов функции // retc - количество возвращаемых параметров lua_pcall(lua,argc,retc,0);
в том то и дело, что не совсем:
void lua_pushcfunction (lua_State *L, lua_CFunction f);
те в качестве параметра функция C, а хотелось бы вытащить идентификатор существующей функции (написанной в самом скрипте) и вставлять его при необходимости
что-то типа:
1. getfield(lua,-1,funcname)
2. id = lua_to...(lua,-1)
...
n-1. lua_push...(lua,id)
n. lua_call(lua,0,0)
n+1. PROFIT!!!
Сохраняй luaRef на свою функцию через luaL_ref и не надо каждый раз парится с поиском.
Тема в архиве.