【问题标题】:To which type does SWIG maps C++ signed char * type in Python?SWIG 将 Python 中的 C++ signed char * 类型映射到哪种类型?
【发布时间】:2014-04-14 15:40:16
【问题描述】:

我需要将非 NULL 终止缓冲区从 Python 传递到 C++。我正在使用带符号的 char* 类型的参数而不是 char*,因为后者将被转换为 NULL 终止字符串。 Python 接口是使用 SWIG (2.0.1) 生成的。未应用类型映射,因此 SWIG 应使用其默认映射。当我尝试使用该方法时,出现以下错误:

NotImplementedError:重载函数的参数数量或类型错误

作为缓冲区,我尝试同时传递字符串和字节数组对象。在这两种情况下,我都会收到上述错误。

如果我在 C++ 中有这样的函数,我应该在 Python 中传递什么类型的对象?

void set_value(signed char *buffer, int size)

【问题讨论】:

  • 缓冲区如何限制?
  • 我提供了缓冲区的大小。编辑帖子以显示这一点。
  • 那么,我认为你必须编写一个自定义类型映射。
  • 由于 SWIG 为这个函数生成了一些接口,我想知道它期望什么类型以及我是否可以使用它并避免编写类型映射。
  • 你必须写一个类型映射。请参阅几天前类似问题中的this answer

标签: python type-conversion swig


【解决方案1】:

你也许可以内联一个接受 C++ 字符串的包装器(不是空终止的),它会是这样的:

%include <std_string.i>
%inline %{
    void set_value_str(const std::string& str) { set_value(str.c_str(), str.size()); }
%}

std_string.i 定义了允许您使用 Python 字符串作为参数调用 set_value_str 的类型映射。但是我不知道类型映射是否使用 std::string 构造函数的 char 数组版本,如果您的缓冲区可以包含空字节,这可能会使此方法无效。

注意:您可以将包装器命名为set_value,不必是不同的名称。

【讨论】:

    猜你喜欢
    • 2016-11-26
    • 2017-05-09
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多