我正在尝试在cython类中使用指针。
outside_class
ctypedef
就像魅力一样,但我无法让inside_class
工作。抛出“此处不允许的ctypedef语句”错误,我不明白错误。
为什么要这样做
outside_class
typdef有效,所以我认为它也应该在里面工作。我无法让它工作,所以我试图找到更多的信息,不幸的是所有信息都是关于outside_class
的例子,所以我不知道是否允许另一个,甚至可能。对我来说,似乎唯一的区别是self
参数。
为什么我希望这项工作
这个类将包含35个具有相同参数的函数,当使用时,只按特定顺序调用这些函数的一部分。初始化时,我想以正确的顺序创建一个包含所有函数的数组。当然,也欢迎采用不同的方式。
更新的代码示例 14-02
测试A& B工作,但C& D没有,错误信息如下。
我的代码:
ctypedef int (*outside_class)()
ctypedef int (*inside_class)(Preprocess)
cdef int outside_foo():
return 12
cdef int outside_bar(Preprocess self):
return 20
cdef class Preprocess:
cdef int inside_foo(self):
return 18
cdef int inside_bar(self):
return 14
cdef int inside_sek(self):
return 16
def __init__(self):
cdef outside_class test_A
test_A = &outside_foo
print( test_A() )
cdef inside_class test_B
test_B = &outside_bar
print( test_B(self) )
cdef inside_class test_C
test_C = &self.inside_foo
#print( test_C(self) )
print( "no error, yet.." )
cdef inside_class test_D
test_D = &self.inside_foo
print( test_D(self) )
错误
/home/boss/.pyxbld/temp.linux-x86_64-2.7/pyrex/aa/preprocessing/preprocessing.c: In function ‘__pyx_pf_7aa_13preprocessing_13preprocessing_10Preprocess___init__’:
/home/boss/.pyxbld/temp.linux-x86_64-2.7/pyrex/aa/preprocessing/preprocessing.c:938:18: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
__pyx_v_test_C = (&((struct __pyx_vtabstruct_7aa_13preprocessing_13preprocessing_Preprocess *)__pyx_v_se
^
/home/boss/.pyxbld/temp.linux-x86_64-2.7/pyrex/aa/preprocessing/preprocessing.c:955:18: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
__pyx_v_test_D = (&((struct __pyx_vtabstruct_7aa_13preprocessing_13preprocessing_Preprocess *)__pyx_v_se
^
12
20
no error, yet..
Segmentation fault (core dumped)
答案 0 :(得分:1)
cython
在cdeftype
定义中看到class
后立即引发错误。它甚至没有查看或运行&self.inside_foo
任务:
0000:~/mypy/cython3$ cython stack42214943.pyx -a
Error compiling Cython file:
------------------------------------------------------------
...
cdef int outside_foo():
return 12
cdef class Preprocess:
ctypedef int (*inside_class)(Preprocess)
^
------------------------------------------------------------
stack42214943.pyx:8:4: ctypedef statement not allowed here
如果我尝试cdef int(*)(Preprocess) inside_test
,我会得到Syntax error in C variable declaration
。再次在self
行之前。
(编辑)
使用以下代码,我可以创建并运行包含3个函数的python列表和同样的C
数组。
def __init__(self):
cdef outside_class test_A
test_A = &outside_foo
print( test_A() )
cdef inside_class test_B
test_B = &outside_bar
print( test_B(self) )
print(self.inside_foo())
cpdef evalc(self):
# cdef int (*inside_array[3]) (Preprocess)
cdef inside_class inside_array[3]
inside_array[0] = self.inside_foo
inside_array[1] = self.inside_bar
inside_array[2] = self.inside_sek
print('eval inside_array')
for fn in inside_array:
print(fn(self))
def evals(self):
alist = [self.inside_foo, self.inside_bar, self.inside_sek]
alist = [fn(self) for fn in alist]
print(alist)
self.evalc()
在Ipython会话中,我可以编译并导入它,并使用:
运行它In [3]: p=stack42214943.Preprocess()
12
20
18
In [4]: p.evals()
[18, 14, 16]
eval inside_array
18
14
16
In [5]: p.evalc()
eval inside_array
18
14
16
我还没有弄明白如何在inside_array
函数之外定义和访问evalc
。但也许我不需要。而不是打印,该函数可以将3个值作为某种int
数组或列表返回。