c++ - SWIG_NewPointerObj 和值始终为零

标签 c++ lua swig

我正在使用 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);
}

结果相同。

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

最佳答案

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

function AI.UnitCreated(self, unit)

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

关于c++ - SWIG_NewPointerObj 和值始终为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2406410/

相关文章:

lua - 有条件地执行来自参数的代码

c++ - 如何从带有蒙版的轮廓图像中获取像素值?

c++ - OpenNI2.0 - 尝试在 Visual Studio 中构建包含的示例项目时出现 LNK 错误

c++ - 如何使用 auto_ptr 作为处理另一个成员变量的成员变量

loops - 为什么Lua没有 "continue"语句?

c++ - 使用 swig 使 C++ 类看起来像一个 numpy 数组

c++ - 从 C++ 文件中获取输入

c++ - 将 C 函数转换为 Lua 函数

java - 如何向 SWIG 生成的 java 添加包声明

c++ - 用 go + swig 替换 c++