Как мне получить данные из Lua
скрипта в С++ коде? Как понимаю обмен данными из скрипта в плюсы идет через особый LUA-Стек
. Помогите разобраться, положим есть вот такая очень полезная функция на Lua
:
function add( x, y )
return x + y
end
В С++ вот такой код :
#include "stdafx.h"
extern "C" {
#include "Lua\lua.h"
#include "Lua\lauxlib.h"
#include "Lua\lualib.h"
}
lua_State* L = NULL;
int from_lua_add(int x, int y)
{
int sum;
lua_getglobal(L, "add");
lua_pushnumber(L, x);
lua_pushnumber(L, y);
lua_call(L, 2, 1); /* Ошибка */
sum = (int)lua_tointeger(L, -1);
lua_pop(L, 1);
return sum;
}
int main()
{
L = lua_open();
luaL_openlibs(L);
luaL_dofile(L, "script.lua");
int summ;
summ = from_lua_add(1, 1);
printf("the summ from lua is %d\n", summ);
lua_close(L);
getchar();
return 0;
}
на вызове lua_call
происходит краш, ошибка такого содержания :
unprotected error in call to lua api (attempt to call a nil value)
Что я сделал не так ?
Примеры кода можно смотреть тут: http://lua-users.org/wiki/SampleCode Есть длинный пример работы с Lua из C++ тут: http://lua-users.org/wiki/CallingLuaFromCpp
Приведу короткий пример получения данных из Lua на C. Отличие от С++ небольшое.
http://lua-users.org/wiki/GettingValuesFromLua
Example code for Lua 5.1.1:
returnone.c:
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
int main()
{
lua_State *L = luaL_newstate();
char buff[] = "return 1,'a'";
int error;
printf( "%d\n", lua_gettop(L) );
error = luaL_loadbuffer(L, buff, strlen(buff), "my test") || lua_pcall(L, 0, LUA_MULTRET, 0);
if (error) {
fprintf(stderr, "%s", lua_tostring(L, -1));
lua_pop(L, 1); /* pop error message from the stack */
}
printf( "%d\n", lua_gettop(L) );
printf( "%s\n", lua_tostring(L,-2) );
printf( "%s\n", lua_tostring(L,-1) );
return 0;
}
Что я сделал не так ?
Вы полностью проигнорировали обработку ошибок в вашем коде.
Функция luaL_dofile
возвращает код ответа, который надо анализировать (сюрприз!), а не просто игнорировать. Это же касается и lua_getglobal
и проч.
Если вы добавите вот такую обработку на компиляцию и запуск скрипта:
int err = luaL_dofile(L, "script.lua");
if (err) {
printf("Cannot dofile: %s", lua_tostring(L, -1));
lua_pop(L, 1);
return 1;
}
то если файл скрипта вдруг будет не найден, будет выведено сообщение:
Cannot dofile: cannot open script.lua: No such file or directory
Так же, будут обработаны любые ошибки синтаксиса в самом скрипте, если он вдруг будет написан с ошибками.
Если же эту обработку убрать, то при недоступности файла script.lua
, будет выведено сообщение как у вас в вопросе.
Виртуальный выделенный сервер (VDS) становится отличным выбором
я новичок в android, и у меня вопрос: можно ли получать (при помощи service) адрес на который пользователь переходит в браузере?
Не могу найти информацию как можно в hibernate работать с двумя источниками данныхС двумя разными базами данных