[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