On Wed, 22 Jul 2009 20:13:45 +0200, "Diez B. Roggisch" <de...@web.de> wrote: > Phil Thompson schrieb: >> On Tue, 21 Jul 2009 11:07:19 +0200, "Diez B. Roggisch" <de...@web.de> >> wrote: >>> On Tuesday 21 July 2009 10:43:14 Phil Thompson wrote: >>>> On Tue, 21 Jul 2009 09:26:39 +0200, "Diez B. Roggisch" <de...@web.de> >>>> >>>> wrote: >>>>> Hi, >>>>> >>>>> well, the subject pretty much says it. The below code exectutes fine >> in >>>>> the debugger until it reaches the line >>>>> >>>>> irr::video::S3DVertex *vertex = (irr::video::S3DVertex >>>>> *)sipConvertToInstance(py_vertex, S3DVertexType, NULL, SIP_NOT_NONE, >>>>> NULL, &err); >>>>> >>>>> >>>>> where "err" then gets some seemingly random value & the program >>>>> terminates. The if-statement below the line doesn't work and was a >>>>> feeble attempt at error-handling - a subject that is given not much >>>>> more >>>>> information in the whole >>>>> >>>>> http://www.riverbankcomputing.com/static/Docs/sip4/c_api.html >>>>> >>>>> page. >>>>> >>>>> Any suggestions? Ah, python is 2.6 on osx, SIP is 4.7.9. >>>>> >>>>> >>>>> Diez >>>>> >>>>> >>>>> void append(SIP_PYLIST, SIP_PYLIST); >>>>> %MethodCode >>>>> PyObject *py_vertices = a0; >>>>> PyObject *py_indices = a1; >>>>> irr::u32 numVertices = PyList_Size(py_vertices); >>>>> irr::video::S3DVertex *vertices = (irr::video::S3DVertex >>>>> *)sipMalloc(sizeof(irr::video::S3DVertex) * numVertices); >>>>> irr::u32 numIndices = PyList_Size(py_indices); >>>>> irr::u16 *indices = (irr::u16*)sipMalloc(sizeof(irr::u16) * >>>>> numIndices); >>>>> >>>>> sipWrapperType *S3DVertexType = >>>>> sipFindClass("irr::video::S3DVertex"); >>>>> >>>>> int err; >>>>> >>>>> for(irr::u32 i=0; i < numVertices; i++) { >>>>> PyObject *py_vertex = PyList_GetItem(py_vertices, i); >>>>> if(sipCanConvertToInstance(py_vertex, S3DVertexType, SIP_NOT_NONE)) { >>>>> irr::video::S3DVertex *vertex = (irr::video::S3DVertex >>>>> *)sipConvertToInstance(py_vertex, S3DVertexType, NULL, SIP_NOT_NONE, >>>>> NULL, &err); >>>>> if(err) { >>>>> return -1; >>>>> } >>>>> vertices[i] = *vertex; >>>>> } // TODO: raise an exception here! >>>>> } >>>>> >>>>> for(irr::u32 i=0; i < numIndices; i++) { >>>>> PyObject *py_index = PySequence_GetItem(py_indices, i); >>>>> irr::u16 indices[3]; >>>>> for(int j=0; j < 3; j++) { >>>>> PyObject *item = PySequence_GetItem(py_index, j); >>>>> if(PyLong_Check(item)) { >>>>> indices[j] = (irr::u16)PyLong_AsLong(item); >>>>> } else { >>>>> // TODO: raise an exception here! >>>>> } >>>>> } >>>>> } >>>>> sipCpp->append((void*)vertices, numVertices, indices, >>>>> numIndices); >>>>> sipFree(indices); >>>>> sipFree(vertices); >>>>> %End >>>> What is S3DVertexType? I would expect it to start with 'sipClass_'. >>> It's a wrapped structure, with the original name >>> "irr::video::S3DVertex". >> >>> After reading the aforementioned docs, I was under the impression that I >>> need >>> to get a sipTypeDef to check & convert. At least pointers of that kind >> are >>> taken from sipConvertToInstance and sipCanConvertToInstance. >> >> It needs to be what the documentation calls a "generated type object" >> which >> all begin with "sipClass_" - probably sipClass_irr_video_S3DVertex in >> this >> case. > > I did that, without any success - the behavior is the same. I get err > set to the value "458520", and the program dies with an bus-error/segfault.
I missed your call to sipFindClass(). It's almost certainly a bug in your handwritten code somewhere - not necessarily in the code above. Phil _______________________________________________ PyQt mailing list PyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt