[PyQt] banging my head on returning short* as void*

Phil Thompson phil at riverbankcomputing.com
Mon Aug 31 22:13:31 BST 2009


On Sat, 29 Aug 2009 20:42:47 +0200, "Diez B. Roggisch" <deets at web.de>
wrote:
> Hi,
> 
> I'm trying to wrap a method with the following signature:
> 
> 		virtual const u16* getIndices() const
> 
> where u16 is typedef'd as simple unsigned short.
> 
> Actually, what I'm really just need is a void* here - the indices are 
> passed to some other function which takes them as such.
> 
> So I tried various things - just giving the above signature makes sip 
> fail (understandably) with
> 
> sip: irr::scene::SMeshBuffer::getIndices() unsupported function return 
> type - provide %MethodCode and a C++ signature
> error: command 
> '/Library/Frameworks/Python.framework/Versions/2.6/bin/sip' failed with 
> exit status 1
> 
> 
> So I tried altering the return-type to void*, what made GCC fail with
> 
> 
> cc1plus: warning: command line option "-Wstrict-prototypes" is valid for 
> C/ObjC but not for C++
> sipirrlichtirrsceneSMeshBuffer.cpp:37: warning: deprecated covariant 
> return type for ‘virtual void* sipirr_scene_SMeshBuffer::getVertices() 
> const’
> ../irrlicht-1.5_svn/include/CMeshBuffer.h:47: warning:   overriding 
> ‘const void* irr::scene::CMeshBuffer<T>::getVertices() const [with T = 
> irr::video::S3DVertex]’
> sipirrlichtirrsceneSMeshBuffer.cpp:40: error: conflicting return type 
> specified for ‘virtual void* sipirr_scene_SMeshBuffer::getIndices()
> const’
> ../irrlicht-1.5_svn/include/CMeshBuffer.h:77: error:   overriding
‘const 
> irr::u16* irr::scene::CMeshBuffer<T>::getIndices() const [with T = 
> irr::video::S3DVertex]’
> sipirrlichtirrsceneSMeshBuffer.cpp: In member function ‘virtual void* 
> sipirr_scene_SMeshBuffer::getVertices() const’:
> sipirrlichtirrsceneSMeshBuffer.cpp:105: error: invalid conversion from 
> ‘const void*’ to ‘void*’
> sipirrlichtirrsceneSMeshBuffer.cpp: In member function ‘virtual void* 
> sipirr_scene_SMeshBuffer::getIndices() const’:
> sipirrlichtirrsceneSMeshBuffer.cpp:150: error: invalid conversion from 
> ‘const void*’ to ‘void*’
> irr_scene.sip: In function ‘PyObject* 
> meth_irr_scene_SMeshBuffer_append(PyObject*, PyObject*)’:
> irr_scene.sip:1062: warning: comparison between signed and unsigned 
> integer expressions
> irr_scene.sip:1065: warning: comparison between signed and unsigned 
> integer expressions
> error: command 'gcc-4.2' failed with exit status 1
> 
> 
> 
> I found sipConvertFromVoidPtr, but don't know how to really use that.
> 
> Any suggestions?

It depends on how general you want the solution to be. If you are talking
about a single method then it is easiest to provide %MethodCode and
%VirtualCatcherCode for that method.

For a more general solution you could typedef const u16* to a phoney type
that you then implemented as a mapped type using whatever Python object you
wanted to represent it.

Phil


More information about the PyQt mailing list