|
Re: Segfault when trying to set attribute of another class: msg#00010python.pyrex
Thanks for your answer. The fixes you told me did not work correctly. But they gave me a push in the right direction On Mon, 2004-03-22 at 00:56, Greg Ewing wrote: > Armin Bauer <armin.bauer@xxxxxxxxxxx>: > > > cdef class CLASS2: > > cdef STRUCT2 *_struct2 > > > > def get_class1(self): > > s = CLASS1() > > s._set_struct1(<object>get_struct1_from_struct2(self._struct2)) > > print "test2" > > return s > > It looks like you're trying to smuggle a non-Python pointer into the > _set_struct1 method by pretending it's a Python object. That won't > work. > > You should NEVER cast a pointer to a Python type unless it really and > truly points to a Python object. Crashing and burning is guaranteed to > result. > > There are two things you could do here: > > (1) Assign the pointer directly, not bothering with a _set_struct1 > method. > > cdef class CLASS2: > ... > def get_class1(self): > cdef CLASS1 *s # <--- note type declaration I get a "Pointer base type cannot be a Python object" error here > s = CLASS1() > s._struct1 = get_struct1_from_struct2(self._struct2) > ... > This approach worked when it is done like this: cdef class CLASS2: ... def get_class1(self): cdef CLASS1 s # <--- note the missing * s = CLASS1() s._struct1 = get_struct1_from_struct2(self._struct2) But now i get "use of cast expressions as lvalues is deprecated" warnings from the generated c file from lines like this with gcc 3.3.3: ((PyObject*)__pyx_v_s) = Py_None; Py_INCREF(((PyObject*)__pyx_v_s)); Switching to gcc 3.2 got rid of these messages. > (2) If you particularly want to set it via an accessor method, use > a C method (introduced in Pyrex 0.9): > > cdef class CLASS1: > ... > # --- Note the following header --- > cdef void _set_struct1(self, STRUCT1 *s1): > self._struct1 = s1 > > cdef class CLASS2: > ... > def get_class1(self): > cdef CLASS1 *s # <--- note type declaration this line also had to be changed to cdef CLASS1 s but i also get the warnings here with the newest gcc > s = CLASS1() > s._set_struct1(get_struct1_from_struct2(self._struct2)) > ... > > Greg Ewing, Computer Science Dept, +--------------------------------------+ > University of Canterbury, | A citizen of NewZealandCorp, a | > Christchurch, New Zealand | wholly-owned subsidiary of USA Inc. | > greg@xxxxxxxxxxxxxxxxxxxxx +--------------------------------------+ > > _______________________________________________ > Pyrex mailing list > Pyrex@xxxxxxxxxxxxxxxxx > http://lists.copyleft.no/mailman/listinfo/pyrex |
|
| <Prev in Thread] | Current Thread | [Next in Thread> |
|---|---|---|
| Previous by Date: | Is this a bug or am I doing it wrong?: 00010, Gary Bishop |
|---|---|
| Next by Date: | Kate? or other Linux editor?: 00010, Charles Hixson |
| Previous by Thread: | Is this a bug or am I doing it wrong?i: 00010, Gary Bishop |
| Next by Thread: | Re: Segfault when trying to set attribute of another class: 00010, Greg Ewing |
| Indexes: | [Date] [Thread] [Top] [All Lists] |
| News | FAQ | advertise |