我有一个 C 标头:
typedef struct
{
<normal members>
void (*cb_func)(glp_tree *T, void *info);
void *cb_info;
<normal members>
} glp_iocp;
目前,在我的 pxd 文件中:
ctypedef struct IntOptCP "glp_iocp":
<normal members>
int out_dly # mip.out_dly (milliseconds)
#void (*cb_func)(Tree* tree, void* info)
# mip.cb_func
#void* cb_info # mip.cb_info
<normal members>
在 pyx 文件中,在某些时候,我(基本上)这样做:
cdef class MyClass:
IntOptCP _iocp
<__cintit__ and the like>
def some_method(self):
<manipulation of self._iocp>
controls = dict()
controls = self._iocp
return controls
这很好用。不过,现在我也想揭露cb_func
and cb_info
。然后这会中断对控件的分配。我想要的是两种 python 对象类型(类?),一种用于cb_func
和一个用于cb_info
,其实例可以传递到cb_func
and cb_info
的论点glp_iocp
struct.
我读过了https://github.com/cython/cython/tree/master/Demos/callback https://github.com/cython/cython/tree/master/Demos/callback(并且已经使用了 pycapsule),但是尽管如此,我对 Cython 缺乏经验/不熟悉,无法了解如何将这些信息用于我的具体案例。
因此,有关如何(最好)公开的任何帮助和指示cb_func
and cb_info
受欢迎的。
看来你可以曝光cb_func
and cb_info
做一些类似于这个玩具示例的事情:
import numpy as np
cimport numpy as np
ctypedef void (*f_type)(int, double*, double*)
ctypedef struct IntOptCP:
int a
double *b
double *c
f_type f
cdef class MyClass:
cdef IntOptCP _iocp
def exec_f(self):
self._iocp.f(self._iocp.a, self._iocp.b, self._iocp.c)
cdef void myfunc(int a, double *b, double *c):
cdef int i
for i in range(a):
b[i] += 1
c[i] += 1
def main():
cdef f_type f
cdef np.ndarray[np.float64_t, ndim=1] b, c
cdef int a
a = 100
b = np.zeros(a, dtype=np.float64)
c = np.zeros(a, dtype=np.float64)
test = MyClass()
test._iocp.a = a
test._iocp.b = &b[0]
test._iocp.c = &c[0]
test._iocp.f = myfunc
print 'before', a, b, c
test.exec_f()
print 'after', a, b, c
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)