【问题标题】:SWIG_NewPointerObj and values always being nilSWIG_NewPointerObj 和值始终为零
【发布时间】:2010-03-10 04:21:15
【问题描述】:

我正在使用 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++ 代码中,单位指针永远不会无效/为空

我也试过了:

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

结果相同。

为什么会失败?我该如何解决?

【问题讨论】:

  • 作为旁注,更改代码以便我在 lua 中只有函数 UnitCreated,并对 C++ 代码进行必要的更改,但如果在表中调用函数则不起作用跨度>

标签: c++ lua swig


【解决方案1】:

当您在function AI:UnitCreated(unit) 中使用冒号时,它会创建一个隐藏的self 参数来接收AI 实例。它实际上的行为是这样的:

function AI.UnitCreated(self, unit)

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

【讨论】:

  • 啊,所以调用 getglobal("ai") 然后推动我的 swig 指针并执行 2 个参数应该可以解决它吗? ^_^
  • @Tom:是的,应该可以解决它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
  • 2016-05-02
  • 2012-01-16
  • 2020-01-07
  • 1970-01-01
相关资源
最近更新 更多