1

Swig 的手册让我有点困惑。我将我的 C 库包装到 python,以便我可以在 python 中测试我的 C 代码。现在我想知道如何在 Python 中访问 C 指针地址,例如,这是我的代码

typedef struct _buffer_t {
char buf[1024];
char *next_ptr;
} buffer_t;



void parse_buffer(buffer_t * buf_p) {
    buf_p -> next_ptr ++;
}

我想做的是在下面,用 C 代码

buffer_t my_buf;
my_buf.next_ptr = my_buf.buf;
parse_buffer(&my_buf);
expect_equal(&(my_buf.buf)+1, my_buf.next_ptr);

我如何在 Python 中做同样的事情?导入 SWIG 包装模块后,我在 python 中有 buffer_t 类。

4

1 回答 1

1

问题是 SWIG 试图将缓冲区包装为 Python 中的字符串,而不仅仅是一个指针。for 的合成赋值next_ptr将分配内存并制作字符串副本,而不仅仅是进行指针赋值。您可以通过多种方式解决此问题。

最简单的就是%extend在 Python 中使用添加一个“reset buffer”方法:

%extend {
  void resetPtr() {
    $self->next_ptr=$self->buf;
  }
}

然后可以在 Python 中调用它来进行你想要的分配。

或者,如果您想强制将缓冲区视为另一个指针,您可以强制 SWIG 将这两个成员视为void*而不是char*and char[]。我曾希望这会像%apply每个类型一样简单,但在我的测试中,memberin 和 memberout 似乎无法正常工作:

%apply void * { char *next };
%apply void * { char buf[ANY] };

鉴于 memberin/memberout 类型映射对于完成这项工作至关重要,我认为这%extend是迄今为止最干净的解决方案。

于 2013-02-20T22:12:39.307 回答