[Pyrex] The newbie's question about wrapping c++ class with pyrex

Yong Sun Yong.Sun at Sun.COM
Sat Apr 19 05:38:55 CEST 2008


Hi, Robert,

Thanks for your reply. I think you article implicitly mentioned how to 
deal the reference parameter (I also figured it out by myself :)), e.g., 
if we have a new member function for Rectangle:

void getPosition (int &x, int &y)

ctypedef struct c_Rectangle "Rectangle":
int x0, y0, x1, y1
..
void getPosition (int x, int y)

This trick will cheat cython/pyrex to prepare the arguments properly. I 
think you may explicitly document this scenario.

Regards,

Robert Bradshaw 写道:
> On Apr 17, 2008, at 6:47 PM, Yong Sun wrote:
>
>> Hi, experts,
>>
>> I am following the tutorial at 
>> http://wiki.cython.org/WrappingCPlusPlus, and found a minor issue,
>>
>> cdef class Rectangle:
>> - c_Rectangle *thisptr # hold a C++ instance which we're wrapping
>> + cdef c_Rectangle *thisptr # hold a C++ instance which we're wrapping
>
> Thanks. I've made this change on the Cython wiki. I also corrected an 
> error about operator overloading.
>
> I'd like to add this example to the automated testing infrastructure, 
> but it seems unclear how to do so with the current runtests.py.
>
>>
>> I need the above change to make it successfully compiled by cython. 
>> While, when I tried to compile it with pyrexc, I met following errors,
>>
>> $ pyrexc --cplus rect.pyx
>> rect.pyx:4:21: Non-extern C function declared but not defined
>> rect.pyx:5:21: Non-extern C function declared but not defined
>> rect.pyx:6:19: Non-extern C function declared but not defined
>> rect.pyx:7:17: Non-extern C function declared but not defined
>> rect.pyx:18:27: Object of type 'c_Rectangle' has no attribute 
>> 'getLength'
>> rect.pyx:20:27: Object of type 'c_Rectangle' has no attribute 
>> 'getHeight'
>> rect.pyx:22:27: Object of type 'c_Rectangle' has no attribute 'getArea'
>> rect.pyx:24:20: Object of type 'c_Rectangle' has no attribute 'move'
>>
>> BTW, I am using the latest stable version,
>>
>> $ pyrexc --version
>> Pyrex version 0.9.6.4
>
> In Pyrex you need to declare functions as function pointers, i.e.
>
> cdef extern from "Rectangle.h":
> ctypedef struct c_Rectangle "Rectangle":
> int x0, y0, x1, y1
> (int *getLength)()
> ...
>
>>
>> Thank you very much!
>>
>> Regards,
>>
>>
>>
>> cdef extern from "Rectangle.h":
>> ctypedef struct c_Rectangle "Rectangle":
>> int x0, y0, x1, y1
>> int getLength()
>> int getHeight()
>> int getArea()
>> void move(int dx, int dy)
>> c_Rectangle *new_Rectangle "new Rectangle" (int x0, int y0, int x1, 
>> int y1)
>> void del_Rectangle "delete" (c_Rectangle *rect)
>>
>> cdef class Rectangle:
>> cdef c_Rectangle *thisptr # hold a C++ instance which we're wrapping
>> def __cinit__(self, int x0, int y0, int x1, int y1):
>> self.thisptr = new_Rectangle(x0, y0, x1, y1)
>> def __dealloc__(self):
>> del_Rectangle(self.thisptr)
>> def getLength(self):
>> return self.thisptr.getLength()
>> def getHeight(self):
>> return self.thisptr.getHeight()
>> def getArea(self):
>> return self.thisptr.getArea()
>> def move(self, dx, dy):
>> self.thisptr.move(dx, dy)
>> _______________________________________________
>> Pyrex mailing list
>> Pyrex at lists.copyleft.no
>> http://lists.copyleft.no/mailman/listinfo/pyrex
>




More information about the Pyrex mailing list