【问题标题】:What is wrong with my SWIG typemap?我的 SWIG 类型图有什么问题?
【发布时间】:2018-12-11 11:31:03
【问题描述】:

我为我的函数创建了一个 SWIG 类型映射。

%typemap(in) (int width, int height, lua_State *L)
{
    if (!lua_isnumber(L, -1) || !lua_isnumber(L, -2))
        SWIG_exception(SWIG_RuntimeError, "argument mismatch: number expected");
    $1 = lua_tonumber(L, -1);
    $2 = lua_tonumber(L, -2);
    $3 = L;
}

但如果我尝试在 Lua 中调用该函数,它不起作用。

我在 Lua 中这样调用这个函数。

createWindow(500,300)

我只想将 width, height 从 Lua 传递给这个函数。

如何修复类型映射以使其正常工作?

【问题讨论】:

  • 实际上,对于采用原始类型的函数,您根本不需要类型映射。
  • @HenriMenke 谢谢。所以我不应该将lua_State* 传递给C++ 函数?如果我只想在特定函数中使用lua_State* 而不是类型映射,我该怎么办?说,我有void createWindow(int width, int height)
  • @HenriMenke 你能告诉我如何在不使用类型映射的情况下做到这一点吗?我是新手。请帮帮我。
  • 在下面查看我的答案。

标签: c++ lua swig typemaps


【解决方案1】:

多参数类型映射在这里无法解决问题,因为它们旨在将单个 Lua 参数映射到多个 C++ 参数。您可以在此处使用默认参数来帮助自己。这是使用%typemap(default) 完成的。我们告诉 SWIG 将任何 lua_State *L 参数默认为 SWIG 使用的实例。

%module window

%{
#include <iostream>

void createWindow(int width, int height, lua_State *L) {
    std::cout << "Creating window of size " << width << "x" << height << '\n'
              << "Number of arguments: " << lua_gettop(L) << '\n';
}
%}

%typemap(default) (lua_State *L) {
    $1 = L;
}

void createWindow(int width, int height, lua_State *L);
local window = require("window")
window.createWindow(500,300)
$ lua5.2 test.lua
Creating window of size 500x300
Number of arguments: 2

【讨论】:

  • 这正是我想知道的。非常感谢先生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
相关资源
最近更新 更多