使用Cython

时间:2017-03-02 11:44:22

标签: python c++ pointers cython

我在使用cython处理指针时遇到了麻烦。该类的cython实现包含指向类Person的C ++实例的指针。这是我的.pyx文件:

person.pyx

cdef class PyPerson:
    cdef Person *pointer

    def __cinit__(self):
        self.pointer=new Person()

    def set_parent(self, PyPerson father):
        cdef Person new_father=*(father.pointer)
        self.c_person.setParent(new_father)        

C ++方法setParentPerson个对象作为参数。由于pointer类的属性PyPerson是指向Person对象的指针,因此我认为我可以使用*pointer指向的地址获取对象的语法{ {1}}。但是,当我尝试编译它时,我收到以下错误

*(PyPersonObject.pointer)

有人知道如何在指针的地址找到对象吗? 当我在C ++程序中执行相同操作时,我没有错误。这里是C ++类的实现,以防你想看到它:

person.cpp

 def set_parent(self, PyPerson father):
    cdef Person new_father=*(father.pointer)
                             ^
------------------------------------------------------------

person.pyx:51:30: Cannot assign type 'Person *' to 'Person'

注意:由于涉及完整课程的其他原因,我无法通过持有Person::Person():parent(NULL){ } Person::setParent(Person &p){ parent=&p; } 实例(Person)来解决此问题。

2 个答案:

答案 0 :(得分:3)

我应该阅读有关使用C ++和Cython的整个cython文档。对于那些不知道的人,解除引用运算符*不能在Cython中使用。相反,您需要从dereference模块导入cython.operator。如果要在指向的地址访问对象,则应编写dereference(pointer)

具体而言,我的问题的答案是写cdef Person new_father=dereference(father.c_person)

答案 1 :(得分:0)

对此的另一种解决方案可能是在位置 import { StatusBar } from "react-native"; ... <StatusBar translucent backgroundColor="transparent" /> 的指针中建立索引,以取消对Cython中的指针的引用。 例如,假设我们有一个golden_ratio C double和一个p_double C指针:

0

我们可以使用地址运算符&:将cdef double golden_ratio cdef double *p_double 地址分配给golden_ratio’s

p_double

我们现在可以使用我们的p_double = &golden_ratio 分配给golden_ratio 索引要零引用的语法:

p_double