SWIG_NewPointerObj и значения всегда равны нулю
Вопрос
Я использую SWIG для упаковки объектов C++ для использования в Lua, и я пытаюсь передать данные методу в моем сценарии Lua, но он всегда выходит как «ноль».
void CTestAI::UnitCreated(IUnit* unit){
lua_getglobal(L, "ai");
lua_getfield(L, -1, "UnitCreated");
swig_module_info *module = SWIG_GetModule( L );
swig_type_info *type = SWIG_TypeQueryModule( module, module, "IUnit *" );
SWIG_NewPointerObj(L,unit,type,0);
lua_epcall(L, 1, 0);
}
Вот код Lua:
function AI:UnitCreated(unit)
if(unit == nil) then
game:SendToConsole("I CAN HAS nil ?")
else
game:SendToConsole("I CAN HAS UNITS!!!?")
end
end
единица всегда равна нулю.Я проверил и в коде С++ указатель единицы измерения никогда не бывает недействительным/нулевым.
Я также пробовал:
void CTestAI::UnitCreated(IUnit* unit){
lua_getglobal(L, "ai");
lua_getfield(L, -1, "UnitCreated");
SWIG_NewPointerObj(L,unit,SWIGTYPE_p_IUnit,0);
lua_epcall(L, 1, 0);
}
с идентичными результатами.
Почему это терпит неудачу?Как это исправить?
Решение
Когда вы используете двоеточие в function AI:UnitCreated(unit)
, он создает скрытое self
параметр, который получает AI
пример.На самом деле это ведет себя так:
function AI.UnitCreated(self, unit)
Поэтому при вызове этой функции из C вам необходимо передать оба параметра:тот ai
экземпляр и unit
параметр.Поскольку вы передали только один параметр, self
был настроен на это и unit
был настроен на nil
.