int vs long

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Mon Dec 17 20:46:56 EST 2007


En Mon, 17 Dec 2007 10:30:05 -0300, Nick Craig-Wood <nick at craig-wood.com>  
escribió:

> Gabriel Genellina <gagsl-py2 at yahoo.com.ar> wrote:
>>  En Sun, 16 Dec 2007 20:28:02 -0300, Troels Thomsen <"nej
>>  tak..."@bag.python.org> escribi?:
>>
>> >
>> > The readFile function from the win32 package aparently really expect  
>> an
>> > integer :
>> >
>> >     def inWaiting(self):
>> >         """Returns the number of bytes waiting to be read"""
>> >         flags, comstat = ClearCommError(self.__handle)
>> >         return comstat.cbInQue
>> >
>> > ReadFile(h, s.inWaiting())
>> >
>> > My code crashes because inWaiting returns a long, not an int
>>
>>  That's very strange. The cbInQue field is a DWORD in C, seen as an int  
>> in
>>  Python. How do you know it returns a long?
>>
>> > Why is that different on my machine and my collegues ? Have I or he
>> > installed a wrong version of a package?
>> > CPython 2.5.
>>
>>  And pywin32 build 210, I presume.
>>
>> > Was not expecting int<->long type problems in excactly python  
>> language.
>> > Is that because we are navigating so close to the win32 api that the
>> > types
>> > are more strictly enforced ?
>>
>>  Somewhat. At the API level, function arguments have to be converted to
>>  native C types, like ReadFile expecting a DWORD. Any number greater  
>> than
>>  2**32 won't fit, but I can't think how such thing could happen looking  
>> at
>>  those few posted code lines.
>
> Actually any number >= 2**31 won't fit in a python int.
>
>   >>> 2**31
>   2147483648L
>
> According to my headers DWORD is defined like this
>
>   typedef unsigned long DWORD;
>
> So you might see longs returned when you expected ints if the result
> was >= 0x8000000.

More than 2GB waiting to be read from a serial port? If that were the case  
the OP has a very big throughput problem rather than an API mismatch :)

-- 
Gabriel Genellina




More information about the Python-list mailing list