为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Python 的 SWIG 中创建时初始化 C 结构成员?

如何在 Python 的 SWIG 中创建时初始化 C 结构成员?

料青山看我应如是 2023-09-05 20:49:41
假设我们在 C 中有一个以下结构:typedef struct buffer{    uint8_t* const data;    const size_t maxSize;    size_t size;} buffer_t;我如何为此制作一个 SWIG 包装器,以便在 Python 中创建 buffer_t 时,它将给定数量的字节分配给数据指针并相应地设置 maxSize?细节所以基本上这里的问题与常量结构成员有关。默认情况下,SWIG 使用默认值初始化结构。这会导致问题:StructWithConsts_t struct;struct.constant = 5; // Error. This should've been set when creating the struct.构造函数和析构函数的公认答案为这个问题提供了解决方案。
查看完整描述

2 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

您可以将 C 结构体视为 SWIG 中的 C++ 类,并使用创建者和销毁者方法扩展它们。


在你的情况下你.i应该有这个


typedef struct

{

    uint8_t* const data;

    const size_t maxSize;

    size_t size;

} buffer_t;


%extend buffer_t {

    buffer_t(size_t size)

    {

        buffer_t* pBuffer = malloc(sizeof *pBuffer);

        pBuffer->data = malloc(size * sizeof (*pBuffer->data));

        pBuffer->maxSize = size;

        return pBuffer;

    }


    void ~buffer_t()

    {

        buffer_t *pBuffer = ($self);

        free(pBuffer->data);

        free(pBuffer);

        return;

    }

};

在Python中它将像这样使用


from yourmodule import buffer_t


buffer = buffer_t(10)

垃圾收集器将负责释放内存。


还有其他方法可以做到这一点,但您没有重现示例来测试它。


查看完整回答
反对 回复 2023-09-05
?
九州编程

TA贡献1785条经验 获得超4个赞

我找到了一种解决方案,但由于指针类型转换,它相当黑客。我不相信这是执行此操作的正确方法,但它有效:


在 .i 文件中,我使用 %inline 创建了一个包装器:


%inline %{

buffer_t* new_buffer(size_t size)

{

    buffer_t* pBuffer = (buffer_t*)malloc(sizeof(buffer_t));

    *(uint8_t**)&pBuffer->data = (uint8_t*)malloc(size * sizeof(uint8_t));

    *(size_t*)&pBuffer->maxSize = size;

    return (buffer_t*)pBuffer;

}


void free_buffer(buffer_t* pBuffer)

{

    free(pBuffer->data);

    free(pBuffer);

    return;

}

%}


查看完整回答
反对 回复 2023-09-05
  • 2 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信