SWIG_NewPointerObj и значения всегда равны нулю - PullRequest
1 голос
/ 09 марта 2010

Я использую SWIG, чтобы обернуть объекты C ++ для использования в lua, и я пытаюсь передать данные методу в моем скрипте lua, но он всегда выглядит как 'nil'

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

единица всегда равна нулю. Я проверил и в коде C ++ указатель блока никогда не является недействительным / null

Я также пробовал:

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);
}

с идентичными результатами.

Почему это не получается? Как мне это исправить?

1 Ответ

2 голосов
/ 09 марта 2010

Когда вы используете двоеточие в function AI:UnitCreated(unit), он создает скрытый параметр self, который получает экземпляр AI. Это на самом деле ведет себя так:

function AI.UnitCreated(self, unit)

Таким образом, при вызове этой функции из C вам необходимо передать оба параметра: экземпляр ai и параметр unit. Поскольку вы передали только один параметр, self был установлен на него, а unit был установлен на nil.

...