Вызов Луа из C - PullRequest
       28

Вызов Луа из C

3 голосов
/ 19 декабря 2011

Я пытаюсь вызвать пользовательскую функцию Lua из C. Я видел некоторое обсуждение этого вопроса, и решение кажется ясным. Мне нужно получить индекс функции с помощью luaL_ref () и сохранить возвращенный индекс для использования позже.

В моем случае я сохранил значение с помощью luaL_ref, и я нахожусь в точке, где мой код на C должен вызывать функцию Lua, сохраненную с помощью luaL_ref. Для этого я использую lua_rawgeti следующим образом:

lua_rawgeti(l, LUA_REGISTRYINDEX, fIndex);

Это вызывает сбой в lua_rawgeti.

Используемый мною индекс - это значение, которое я получил от luaL_ref, поэтому я не уверен, что здесь происходит.

EDIT:

Я запускаю скрипт Lua следующим образом:

function errorFunc()
  print("Error")
end

function savedFunc()
  print("Saved")
end

mylib.save(savedFunc, errorFunc)

Я определил свою собственную библиотеку Lua 'mylib' с функцией C:

static int save(lua_State *L) 
{
    int cIdx = myCIndex = luaL_ref(L, LUA_REGISTRYINDEX);
    int eIdx = luaL_ref(L, LUA_REGISTRYINDEX);

Я сохраняю cIdx и eIdx до более позднего момента времени, когда получаю какое-то внешнее событие, и в этот момент я хотел бы вызвать одну из функций, заданных в качестве параметров в моем Lua-скрипте. Здесь (в том же потоке, используя тот же lua_State *), я вызываю:

lua_rawgeti(L, LUA_REGISTRYINDEX, myCIndex);

Что является причиной сбоя.

Ответы [ 2 ]

0 голосов
/ 09 августа 2012

Как упоминал @Schollii, я делал этот вызов после выполнения lua_close (L).

0 голосов
/ 04 августа 2012

Мое первое предложение - заставить его работать без сохранения функции в Си. Просто назначьте свою функцию глобальному в Lua, затем в C используйте состояние Lua (L), чтобы получить глобальное, выдвинуть аргументы, вызвать функцию и использовать результаты. Как только это сработает, вы освоите основы и узнаете, что ваша функция работает, вы можете изменить способ использования реестра для использования реестра. Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...