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

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

python(ctypes)中的回調(diào)問題

python(ctypes)中的回調(diào)問題

慕婉清6462132 2022-10-06 16:19:52
我在 python 中遇到了 CTYPES 的問題。我已經(jīng)準備好帶有一些回調(diào)的 dll 庫。在 swift 上一切正常,但我在 python 中有一些問題。Python:def set_up_callback(self):    self.lib.set_callback(self.callback1)@CFUNCTYPE(None, c_float, c_float, c_float, c_uint64)def callback1( a, b, c, time):    print(a, b, c, time)c++回調(diào)聲明typedef void(*callbackType)(float, float, float, uint64_t, void*);        callbackType callback;void* context;C++ 初始化void setCallback(callbackType callback, void* context) {        this->context = context;        this->callback = callback;}C++ 歸納callback(1.5f, 2.4f, 1.3f, timestamp, context);共享.hextern "C" void SHARED_EXPORT set_callback(callbackType callback, void* context);這很好用,但我想要selfIn 回調(diào)函數(shù),所以我試試這個def set_up_callback(self):    callback_type = CFUNCTYPE(None, c_float, c_float, c_float, c_uint64)    callback = callback_type(self.callback1)    self.lib.set_callback(callback)def callback1(self, a, b, c, time):    print(a, b, c, time)通過這個嘗試我有錯誤Segmentation fault: 11預(yù)先感謝您的幫助
查看完整描述

1 回答

?
德瑪西亞99

TA貢獻1770條經(jīng)驗 獲得超3個贊

In set_up_callback,callback是一個局部變量,在調(diào)用 后超出范圍self.lib.set_callback(callback)。callback您必須在可以調(diào)用的生命周期內(nèi)保留對的引用,因此將其存儲為類實例的成員變量。


工作演示:


演示.cpp


#include <time.h>

#include <stdint.h>


#if defined(_WIN32)

#   define API __declspec(dllexport)

#else

#   define API

#endif


typedef void(*CALLBACK)(float, float, float, uint64_t, void*);


CALLBACK g_callback;


extern "C" {


API void set_callback(CALLBACK callback) {

    g_callback = callback;

}


API void demo(void* context) {

    if(g_callback)

        g_callback(1.5f, 2.4f, 1.3f, time(nullptr), context);

}


}

演示.py


from ctypes import *

from datetime import datetime


CALLBACK = CFUNCTYPE(None,c_float,c_float,c_float,c_uint64,c_void_p)


class Demo:

    def __init__(self):

        self.lib = CDLL('./demo')

        self.lib.set_callback.argtypes = CALLBACK,

        self.lib.set_callback.restype = None

        self.lib.demo.argtypes = c_void_p,

        self.lib.demo.restype = None

        self.set_up_callback()


    def callback(self,a,b,c,timestamp,context):

        print(a,b,c,datetime.fromtimestamp(timestamp),self.context)


    def set_up_callback(self):

        self.callback = CALLBACK(self.callback)

        self.lib.set_callback(self.callback)


    def demo(self,context):

        self.context = context

        self.lib.demo(None)


demo = Demo()

demo.demo([1,2,3])

demo.demo(123.456)

demo.demo('a context')

輸出:


1.5 2.4000000953674316 1.2999999523162842 2020-04-11 11:38:44 [1, 2, 3]

1.5 2.4000000953674316 1.2999999523162842 2020-04-11 11:38:44 123.456

1.5 2.4000000953674316 1.2999999523162842 2020-04-11 11:38:44 a context


查看完整回答
反對 回復(fù) 2022-10-06
  • 1 回答
  • 0 關(guān)注
  • 222 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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