亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 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 關注
  • 165 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號