Вызвать функцию в Lua и получить возвращаемое значение в C++

226
31 января 2018, 14:19

Как мне получить данные из 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)

Что я сделал не так ?

Answer 1

Примеры кода можно смотреть тут: 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;
}
Answer 2

Что я сделал не так ?

Вы полностью проигнорировали обработку ошибок в вашем коде.

Функция 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, будет выведено сообщение как у вас в вопросе.

READ ALSO
проверка адресной строки в браузере

проверка адресной строки в браузере

я новичок в android, и у меня вопрос: можно ли получать (при помощи service) адрес на который пользователь переходит в браузере?

178
Почему тэг th:text не срабатывает

Почему тэг th:text не срабатывает

У меня есть следующий код adminjsp:

210
hibernate multi source data

hibernate multi source data

Не могу найти информацию как можно в hibernate работать с двумя источниками данныхС двумя разными базами данных

206