第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何在 Python 的 SWIG 中創(chuàng)建時(shí)初始化 C 結(jié)構(gòu)成員?

如何在 Python 的 SWIG 中創(chuàng)建時(shí)初始化 C 結(jié)構(gòu)成員?

假設(shè)我們?cè)?C 中有一個(gè)以下結(jié)構(gòu):typedef struct buffer{    uint8_t* const data;    const size_t maxSize;    size_t size;} buffer_t;我如何為此制作一個(gè) SWIG 包裝器,以便在 Python 中創(chuàng)建 buffer_t 時(shí),它將給定數(shù)量的字節(jié)分配給數(shù)據(jù)指針并相應(yīng)地設(shè)置 maxSize?細(xì)節(jié)所以基本上這里的問題與常量結(jié)構(gòu)成員有關(guān)。默認(rèn)情況下,SWIG 使用默認(rèn)值初始化結(jié)構(gòu)。這會(huì)導(dǎo)致問題:StructWithConsts_t struct;struct.constant = 5; // Error. This should've been set when creating the struct.構(gòu)造函數(shù)和析構(gòu)函數(shù)的公認(rèn)答案為這個(gè)問題提供了解決方案。
查看完整描述

2 回答

?
一只名叫tom的貓

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超3個(gè)贊

您可以將 C 結(jié)構(gòu)體視為 SWIG 中的 C++ 類,并使用創(chuàng)建者和銷毀者方法擴(kuò)展它們。


在你的情況下你.i應(yīng)該有這個(gè)


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)

垃圾收集器將負(fù)責(zé)釋放內(nèi)存。


還有其他方法可以做到這一點(diǎn),但您沒有重現(xiàn)示例來測試它。


查看完整回答
反對(duì) 回復(fù) 2023-09-05
?
九州編程

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超4個(gè)贊

我找到了一種解決方案,但由于指針類型轉(zhuǎn)換,它相當(dāng)黑客。我不相信這是執(zhí)行此操作的正確方法,但它有效:


在 .i 文件中,我使用 %inline 創(chuàng)建了一個(gè)包裝器:


%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;

}

%}


查看完整回答
反對(duì) 回復(fù) 2023-09-05
  • 2 回答
  • 0 關(guān)注
  • 183 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)