SWIG_NewPointerObj和值始终为零

时间:2010-03-09 03:18:43

标签: c++ lua swig

我正在使用SWIG来包装用于lua的C ++对象,我试图将数据传递给我的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 个答案:

答案 0 :(得分:2)

function AI:UnitCreated(unit)中使用冒号时,会创建一个隐藏的self参数,用于接收AI实例。它实际上表现得像这样:

function AI.UnitCreated(self, unit)

因此,当从C调用该函数时,您需要传递两个参数:ai实例和unit参数。由于您只传递了一个参数,因此self设置为unitnil设置为{{1}}。