Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的回调问题(ctypes)_Python_C++_Ctypes - Fatal编程技术网

python中的回调问题(ctypes)

python中的回调问题(ctypes),python,c++,ctypes,Python,C++,Ctypes,嗨,我对python中的CTYPES有问题。我已经准备好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

嗨,我对python中的CTYPES有问题。我已经准备好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++ 收回声明

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);
共享

extern "C" void SHARED_EXPORT set_callback(callbackType callback, void* context);
这很好,但我希望回调函数中有
self
,所以我尝试了这个

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)
通过这次尝试,我发现了错误
分段错误:11


提前感谢您的帮助

设置回调
中,
回调
是一个局部变量,在调用
self.lib.set\u回调(回调)
后超出范围。您必须在可以调用的生存期内保留对
回调的引用,因此将其存储为类实例的成员变量

工作演示:

demo.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);
}

}
输出:

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

set\u-up\u-callback
中,
callback
是一个局部变量,在调用
self.lib.set\u-callback(callback)
后超出范围。您必须在可以调用的生存期内保留对
回调的引用,因此将其存储为类实例的成员变量

工作演示:

demo.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);
}

}
输出:

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