[PyQt] SIP Question (Not PyQT/PyKDE related)

Doyon, Jean-Francois jdoyon at NRCan.gc.ca
Thu Jul 5 16:48:06 BST 2007


Phil,

Thanks a bunch, just go the snapshot, and things now work as expected.

One thing though re: reference passing:

I wanted Python to get the reference so that everything gest cleaned up
properly, so I added a /TransferBack/ (Actually /Out,TransferBack/) to
the method signature, only now glibc complains that free() is called on
an invalid pointer when the interpreter shuts down! Is that right?

I may end up using the C++ toolkit I'm wrapping a long-running, even
threaded process (a server), so I want to make sure I get this right.

Thanks,
J.F.

-----Original Message-----
From: pyqt-bounces at riverbankcomputing.com
[mailto:pyqt-bounces at riverbankcomputing.com] On Behalf Of Phil Thompson
Sent: July 4, 2007 16:25
To: pyqt at riverbankcomputing.com
Subject: Re: [PyQt] SIP Question (Not PyQT/PyKDE related)

On Wednesday 04 July 2007 8:37 pm, Doyon, Jean-Francois wrote:
> Hello,
>
> I've been using SIP to wrap a closed source binary SDK for Linux I 
> have, with quite a bit of success considering I don't know much of C++

> (Kudos to the SIP team!).
>
> Now I have a slight problem that I'm not sure to address so I'm 
> wondring if someone could point me in the right direction.
>
> I have the following signature:
>
> LT_STATUS getDataByIndex(lt_uint32 index, const LTIMetadataRecord*& 
> record) const;
>
> Everything here is fine, except for that *& notation which I haven't 
> come across before.

For SIP you need to add the /Out/ annotation to the record argument.
Current versions of SIP will then complain about using /Out/ with const
arguments. 
That will be fixed in tonight's snapshot.

> The example C++ code does something like this to use this method:
>
>    for (i=0; i<numRecs; i++)
>    {
>       const LTIMetadataRecord* rec = NULL;
>       sts = db.getDataByIndex(i, rec);
>       ASSERT(LT_SUCCESS(sts));
>
>       dumpRecord(*rec);
>    }

If it's important that rec is initialised to NULL before calling
getDataByIndex() then you will have to do this with some %MethodCode.

> The problem for me is that LTIMetadataRecord does NOT have
constructors. 
> So I'm not sure what to pass getDataByIndex() for the second
parameter.
>
> I tried something like:
>
> record = None
> db.getDataByIndex(index, record)
> print record

You will then use it like this...

sts, record = db.getDataByIndex(index)

> But "record" remains unchanged.  Of course, I can't create an instance

> of LTIMetadataRecord, so I'm not sure how else to go about this.
>
> Any have an idea, or ideally, a recipe? (Or maybe there's an example 
> of something like this in PyQT/PyKDE?)
>
> Any help would be much appreciated!

The other thing to note is that C++ owns the record, ie. it will not be
destroyed when the Python object is garbage collected. Use one of the
transfer annotations if you want to change that.

Phil
_______________________________________________
PyQt mailing list    PyQt at riverbankcomputing.com
http://www.riverbankcomputing.com/mailman/listinfo/pyqt



More information about the PyQt mailing list