Войти
ПрограммированиеФорумИгровая логика и ИИ

lua - как получить из стека функцию

#0
14:29, 7 июля 2010

Здравствуйте
у меня достаточно много функций, которые я не хотел бы искать каждый раз, когда они потребуются)))
можно ли сохранить один раз эти функции, а потом класть в стек и запускать?

заранее спасибо за возможные ответы)


#1
14:52, 7 июля 2010

sergiokey
> ...а потом класть в стек и запускать?
А зачем запускать функцию через стек, когда можно по зарегистрированному имени

int myfunction(int param)
{
//что-нибудь...
}

//где-то в коде...
lua_register(lua, "myfunction", myfunction);
luaL_dostring(lua, "myfunction(333)");
//...
#2
15:24, 7 июля 2010

Вообще то вернее будет так:

static int MyFuinction( lua_State* L )
{
  int val = lua_tonumber(L, -1);
//что-нибудь
  return 1;
};

//где-то в коде...
lua_register(lua, "myfunction", myfunction);
luaL_dostring(lua, "myfunction(333)");
//...

#3
15:31, 7 июля 2010

xapac
> Вообще то вернее будет так:...

ОПС!)) Ну я что-то загнался, просто не этим занят щас - давно не писал скриптов

#4
15:40, 7 июля 2010

vater
> А зачем запускать функцию через стек, когда можно по зарегистрированному имени
только мы придем к тому же, да еще луа будет строку парсить, а я как раз пытаюсь от этого уйти:
у меня и так уже более оптимизированный вариант - ищу через getstate и запускаю, только закопаны они у меня, поэтому хотелось бы как то это проинициализировать, а потом когда надо - запускать без поиска по какому нибудь идентификатору либо поинтеру

#5
0:45, 8 июля 2010

а любопытная идея - запускать функции прямо из стека. Исключает поиск по имени. Хотя конечно выигрыш по производительности несколько сомнительный, но мало ли.
Вроде бы нужное заклинание выглядит примерно так:

lua_pushcfunction(lua,myfunction);
// argc - количество аргументов функции
// retc - количество возвращаемых параметров
lua_pcall(lua,argc,retc,0); 

#6
9:56, 8 июля 2010

в том то и дело, что не совсем:
void lua_pushcfunction (lua_State *L, lua_CFunction f);
те в качестве параметра функция C, а хотелось бы вытащить идентификатор существующей функции (написанной в самом скрипте) и вставлять его при необходимости

#7
10:31, 8 июля 2010

что-то типа:
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!!!

#8
12:37, 8 июля 2010

Сохраняй luaRef на свою функцию через luaL_ref и не надо каждый раз парится с поиском.

ПрограммированиеФорумИгровая логика и ИИ

Тема в архиве.