[Qgis-developer] QgsRasterBlock.setColor(size_t, QRgb) in SIP

Radim Blazek radim.blazek at gmail.com
Thu Oct 24 07:53:30 PDT 2013


Related issue http://hub.qgis.org/issues/6505

Radim

On Thu, Oct 24, 2013 at 4:40 PM, Radim Blazek <radim.blazek at gmail.com> wrote:
> On Thu, Oct 24, 2013 at 3:46 AM, Martin Dobias <wonder.sk at gmail.com> wrote:
>> On Thu, Oct 24, 2013 at 1:32 AM, Radim Blazek <radim.blazek at gmail.com> wrote:
>>> On Wed, Oct 23, 2013 at 7:07 PM, Martin Dobias <wonder.sk at gmail.com> wrote:
>>>> When I enter those two lines into QGIS python console, it work fine
>>>> (no debug output, result of setColor() call is True). Tested on linux
>>>> 64bit, QGIS master (debug), SIP v4.15.2.
>>>
>>> could you also test if you get the right value from block back
>>>    block.color( index )
>>> and with indexes > 0
>>
>> Yes, I get correct values.
>>
>>>> Otherwise I do not really have an idea what goes wrong there (btw. the
>>>> index is an interesting number - in hex it is 0x7ff800000000
>>>
>>> it does not seem to be really correct
>>>
>>>> - maybe it is not handling size_t type correctly?
>>>
>>> yes, size_t seems to be the problem, it is not defined in qgsrasterblock.sip,
>>> probably the definition from qgsgeometry.sip is used:
>>>   %If (WS_MACX)
>>>   typedef unsigned long size_t;
>>>   %End
>>>   %If (WS_X11 || WS_WIN)
>>>   typedef unsigned int size_t;
>>>   %End
>>> which does not seem to be very robust.
>>
>> Indeed, the definition does not look robust. Will it help if you
>> change size_t definition for your platform to "unsigned long long" ?
>> (assuming you are on 64bit OS)
>
> Then I get
>
>>>> block.setColor( 0, QColor ().rgb() )
> Traceback (most recent call last):
>   File "<input>", line 1, in <module>
> TypeError: arguments did not match any overloaded call:
>   QgsRasterBlock.setColor(int, int, int): not enough arguments
>   QgsRasterBlock.setColor(int, int): argument 1 has unexpected type 'int'
>
> works with "unsigned long". In C++ I have size_t defined as "long
> unsigned int" (gives compilation error if used in sip file) which
> should be the same as "unsigned long" I believe.
>
> The problem is wrong definition of size_t in sip file. It should not
> work for you as well, right? If you are on Linux you get "typedef
> unsigned int size_t" in sip which is not the same as size_t in C++. I
> guess that it accidentally works because by chance the memory used by
> wider type is zeroed.
>
>> There was a thread on size_t in PyQt some time ago:
>> http://www.riverbankcomputing.com/pipermail/pyqt/2006-March/012753.html
>
> Yes, I saw, quite old and no solution. If I look into stddef.h
> (/usr/lib/gcc/x86_64-linux-gnu/4.6/include/stddef.h) the typedef of
> size_t is quite complex.
>
> So how can we reliably define size_t in sip file?
>
>>> BTW, how to define such things
>>> correctly, in each sip file or globally in another sip file for all?
>>
>> You need to define these things just once in one of the .sip files.
>> The order is not important (unlike c/c++).
>
> I mean what is the best practice to do that in QGIS. Would not it be
> better to have shared definitions separated into some common.sip?
>
> Radim
>
>> Martin


More information about the Qgis-developer mailing list