Встраиваю к себе lua после неудачной попытки отыскать встраиваемый C Встроить язык си в программу на языке си ::), всё хорошо через Lua C/API делаю вызовы С функций, через FFI делаю вызовы, из C вызываю функции lua и из lua вызываю С функции вызывающие lua код, короче наигрался. Но вот что я не пойму мы инициализируем lua_State
затем загружаем скрипт к примеру luaL_loadfile(L,"./test.lua");
затем исполняем его lua_pcall(L, 0, 1, 0);
он отрабатывает, возвращает мне что-то и что я получаю printf("Get script return value => %s\n",lua_tostring(L,-1));
, а теперь я исполняю его снова иииии
test2
PANIC: unprotected error in call to Lua API (attempt to call a nil value)
Чуть подробнее C
lua_State * L = luaL_newstate();
luaL_openlibs(L);
int status = luaL_loadfile(L,"./luatest2.lua");
if(status)
{
debug("filed load script: %s ",lua_tostring(L, -1));
}
lua_pcall(L, 0, 1, 0);
lua_pcall(L, 0, 1, 0);
Lua
print("hello");
Выхлоп (вызов только 1 раз, хотя я дёргаю два раза)
hello
Но вспоминаю я ж ничего не возвращаю и не читаю результат возврата и поэтому убираю возвраты
lua_pcall(L, 0, 0, 0);
lua_pcall(L, 0, 0, 0);
И получаю выхлоп
hello
PANIC: unprotected error in call to Lua API (attempt to call a nil value)
Я такой репу чешу и вызываю так
luaL_loadfile(L,"./luatest2.lua");
lua_pcall(L, 0, 0, 0);
luaL_loadfile(L,"./luatest2.lua");
lua_pcall(L, 0, 0, 0);
Выхлоп с двумя «hello» всё верно и ошибки нет.
И вот две вещи которых я недопойму, luaL_loadfile()
или остальные функции загрузки кода надо каждый раз вызывать перед lua_pcall
? Разве lua_State
не хранит текущий кусок кода в себе? Ну и второй вопрос про lua_pcall
с 0 параметром возврата это так и надо или нет?
Версия luajit ниже, самосбор, без ключей сборки просто make
c си кодом линковка статическая если это важно (статик линковка для проверки возможности вызова функций из lua си функций из самой же программы без загрузки lib.so)
LuaJIT-2.0.5