为Python创建C++(指针)的SWIG包装器

2024-10-01 17:31:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个非常新的Sug,我正在尝试创建一个Sigg包装器,以便在Python中使用一些C++文件。我有以下C++类。在

以下是我尝试转换的代码片段:

/*packet_buffer.h*/
class CPacketBuffer {
 public:
    // construct based on given buffer, data is not copied
    CPacketBuffer(uint8_t* data, uint32_t length) {
        mpBuffer = data;
        mLength  = length;
        mHead    = 0;
        mTail    = length;
    }
    uint8_t* GetBuffer() {
        return (mpBuffer + mHead);
    }
    void Add(const uint8_t* data, uint32_t length) {
            if ((mTail + length) > mLength) {
            length = (mLength - mTail);
        }
//....
}

我一直在试图写一个例子。我的文件,可以接受指向typedefs(uint8_t*)的指针,今天使用swig文档的帮助,但是我没有成功。在

下面是一个数据包缓冲区。我已经尝试过了,但它不起作用。在

^{pr2}$
  1. 如何为成员函数编写swig代码,以获取指向typedef的指针?在
  2. 我可以编写一个通用的%apply,可以在代码中使用吗?还是必须为每个输入、输出参数编写细节?在

Tags: 文件代码databufferlengthswig指向指针
1条回答
网友
1楼 · 发布于 2024-10-01 17:31:33

如果我理解正确的话,你面临的问题不是它们是指针,而是它们可能是无限数组。在

您可以warp an unbounded C array使用carrays.i和“%array_class”宏,例如:

%module packet
%include "stdint.i"

%{
    #include "packet.h"
%}

%include "carrays.i"
%array_class(uint8_t, buffer);

%include "packet.h"

然后允许您在Python中编写如下内容:

^{pr2}$

注意,你需要确保缓冲区的生命是足够的——如果Python对象在没有C++代码的情况下被释放,那么你将最终得到不确定的行为。在

您可以使用%array_class宏也创建的frompointer方法将uint8_t*指针(无界数组)转换为Python中的缓冲区实例,例如:

r = packet.GetBuffer()
buf = packet.buffer_frompointer(r)

如果需要,您可以add additional Python code自动/隐藏缓冲区之间的大部分转换,或者使用MemoryViews在C API端与Python进行更紧密的集成。在

一般来说,尽管这是C++,但我建议使用^ {CD4>},它比Python端使用的无边无际的数组要好得多,而且它给你的安全性和简单性的代价是最小的。在

相关问题 更多 >

    热门问题