У меня есть google high и low и найдены примеры, но ни один из них не работает (Lua 5.2).Вызов функции Lua из C++
У меня есть простая функция в Lua
function onData (data)
print (data)
end
Я хочу назвать onData
от C++ и попытался это:
// Create new Lua state
L = luaL_newstate();
// Load all Lua libraries
luaL_openlibs(L);
// Create co-routine
CO = lua_newthread(L);
// Load and compile script
AnsiString script(Frame->Script_Edit->Text);
if (luaL_loadbuffer(CO,script.c_str(),script.Length(),AnsiString(Name).c_str()) == LUA_OK) {
Compiled = true;
} else {
cs_error(CO, "Compiler error: "); // Print compiler error
Compiled = false;
}
// Script compiled and ready?
if (Compiled == true) {
lua_getglobal(CO, "onData"); // <-------- Doesn't find the function
if(!lua_isfunction(CO,-1)) {
lua_pop(CO,1);
return;
}
lua_pushlstring(CO,data,len);
lua_resume(CO,NULL,0)
}
Как вы можете видеть, я начинаю свой сценарий как со- поэтому я могу использовать функцию lua_yield()
. Я попытался найти функцию в состояниях L
и CO
.
Но lua_loadbuffer() компилирует скрипт и помещает его в стек для выполнения, поэтому он должен быть известен. luaL_dostring() скомпилирует И выполнит скрипт, после чего кусок будет вставлен в стек. Как вы можете видеть, мне нужно использовать lua_resume, поэтому я могу использовать функцию lua_yield(). Если я сначала запустил сценарий, тогда будет запущен другой код, чем желаемая функция. Я только хочу запустить эту функцию, ничего больше. –
@MaxKielland lhf является одним из создателей Lua. Вероятно, он хорошо знает, о чем говорит. Поэтому я предлагаю на самом деле попробовать его предложение и посмотреть, работает ли оно (потому что это, вероятно, будет). –
@MaxKielland, если вы хотите определить 'onData', вам нужно запустить скрипт. Кроме того, вам нужно 'lua_resume (CO, NULL, 1)' передать 'data' в' onData'. – lhf