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

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

Python ctypes cdll.LoadLibrary,實(shí)例化一個(gè)對(duì)象,執(zhí)行其方法

Python ctypes cdll.LoadLibrary,實(shí)例化一個(gè)對(duì)象,執(zhí)行其方法

我在c中編寫了一個(gè)dll庫(kù),使用vs2017 64位編譯,并嘗試使用64位python3.6加載它。但是,對(duì)象的成員變量的地址被截?cái)酁?2位。這是我的sim.c文件,它被編譯為sim.dll:class Detector {public:    Detector();    void process(int* pin, int* pout, int n);private:    int member_var;};Detector::Detector(){    memset(&member_var, 0, sizeof(member_var));    myfile.open("addr_debug.txt");    myfile << "member_var init address: " << &member_var << endl;}void Detector::process(int* pin, int* pout, int n);{    myfile << "member_var process address: " << &member_var << endl;    myfile.close();}#define DllExport   __declspec( dllexport )  extern "C" {    DllExport Detector* Detector_new() { return new Detector(); }    DllExport void Detector_process(Detector* det, int* pin, int* pout, int n)    {        det->process(pin, pout, n);    }}這是我的python腳本:from ctypes import cdlllib = cdll.LoadLibrary(r'sim.dll')class Detector(object):    def __init__(self):        self.obj = lib.Detector_new()    def process(self,pin, pout, n):        lib.Detector_process(self.obj,pin, pout, n)detector = Detector()n = 1024a = np.arange(n, dtype=np.uint32)b = np.zeros(n, dtype=np.int32)aptr = a.ctypes.data_as(ctypes.POINTER(ctypes.c_int))bptr = b.ctypes.data_as(ctypes.POINTER(ctypes.c_int))detector.process(aptr, bptr, n)這是addr_debug.txt中member_var的地址:member_var init address:    0000025259E123C4member_var process address: 0000000059E123C4因此訪問(wèn)它會(huì)觸發(fā)內(nèi)存訪問(wèn)錯(cuò)誤:OSError: exception: access violation reading 0000000059E123C4我試圖了解這個(gè)問(wèn)題的一些嘗試:將member_var定義為public而不是private,而不是幫助,地址仍然被截?cái)唷ember_var定義為全局變量,然后地址就可以了。所以我猜想在將對(duì)象返回到python或?qū)?duì)象傳遞回dll時(shí)會(huì)發(fā)生member_var地址截?cái)唷?
查看完整描述

2 回答

?
肥皂起泡泡

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

從你那里學(xué)到了很多東西。所以問(wèn)題是Detector對(duì)象地址被截?cái)酁槟J(rèn)的int,因?yàn)槲覜](méi)有指定函數(shù)返回類型。由于成員變量的地址是相對(duì)于對(duì)象的基址,當(dāng)將錯(cuò)誤的對(duì)象基地址傳遞給DetectorProcess函數(shù)時(shí),包含所有成員變量的該對(duì)象的每個(gè)相對(duì)地址都會(huì)混亂。令我感到驚訝的是,即使pDet指針錯(cuò)誤,也可以執(zhí)行“pDet-> process()”函數(shù)。

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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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