Передача неглобальных объектов C ++ в функции Lua (Swig)

Я расширяю интерфейс с помощью lua, и у меня возникла проблема, заключающаяся в том, что мне нужно было передать указатели на объекты в код lua для работы. Эти классы будут обернуты через SWIG, и я мог бы создать их экземпляры через lua, используя swig, но это оставило бы меня с бесполезными объектами.

Мне нужно иметь возможность передавать объект обратного вызова в lua, а также объекты, представляющие вещи в событиях. Я не могу вручную определить обратный вызов как глобальный, потому что это приведет к недопустимому ограничению.

Итак, для общего примера, учитывая класс C и функцию в lua, которая принимает 1 параметр, как мне вызвать эту функцию lua, передав ей указатель C ++ типа C?


person Tom J Nowell    schedule 07.03.2010    source источник


Ответы (2)


Ага, отвечу на свой вопрос, но нашел!

http://lua-users.org/lists/lua-l/2007-05/msg00053.html

Привет, Джоуи,

Я почти всю свою работу с SWIG-LUA выполняю со стороны lua. Swig действительно хорош для того, чтобы просто обернуть библиотеку C / C ++, чтобы сделать ее читаемой с помощью lua. Заставить C ++ взаимодействовать с lua довольно просто, но это плохо документировано.

Вы идея lua_pushlightuserdata(), была близка, но не там. Вы, вероятно, захотите что-то вроде этого:

Foo* p= new Foo();
SWIG_NewPointerObj(L,p,SWIGTYPE_p_Foo,1);
lua_setglobal (L, "p");

SWIG_NewPointerObj () создает пользовательские данные (не lightuserdata) для объекта foo и помещает их в стек. Последний параметр (в данном случае 1) - это то, хотите ли вы, чтобы lua управлял памятью (0 - нет, 1 - да).

SWIG_NewPointerObj() и SWIGTYPE_p_Foo находятся в файле упаковки.

Как только вы это сделаете, вы сможете делать это в lua:

print(p)
print(swig_type(p))
p:some_function()

Дайте мне знать, если у вас есть еще вопросы. С уважением, Марк

person Tom J Nowell    schedule 07.03.2010

Я не использовал Swig с C ++ и Lua, но вы можете сделать это без Swig двумя разными способами (пользовательские данные и замыкания). Не знаю, мешает ли Свиг как-то этому.

Использование данных пользователя

lua_pushcclosure

person Tuomas Pelkonen    schedule 07.03.2010