So, knowing there's a potential cross platform inconsistency here, is there a proposed way to deal with this that doesn't involve modifying the real c code I'm interfacing with? That's not always an option.

On Mon, Apr 25, 2011 at 2:49 PM, Santoso Wijaya <report@bugs.python.org> wrote:

Santoso Wijaya <santoso.wijaya@gmail.com> added the comment:

What compilers were used to build your Python distro and the native structure?

I found out in _ctypes/cfield.c (lns. 76-95):

if (bitsize /* this is a bitfield request */
&& *pfield_size /* we have a bitfield open */
#ifdef MS_WIN32
/* MSVC, GCC with -mms-bitfields */
&& dict->size * 8 == *pfield_size
#else
/* GCC */
&& dict->size * 8 <= *pfield_size
#endif
&& (*pbitofs + bitsize) <= *pfield_size) {
/* continue bit field */
fieldtype = CONT_BITFIELD;
#ifndef MS_WIN32
} else if (bitsize /* this is a bitfield request */
&& *pfield_size /* we have a bitfield open */
&& dict->size * 8 >= *pfield_size
&& (*pbitofs + bitsize) <= dict->size * 8) {
/* expand bit field */
fieldtype = EXPAND_BITFIELD;
#endif

So the allocation of the extra byte for the structure seems to depend on Python's compiler. To make sure, I compiled a native structure using MSVC:

#pragma pack(1)
typedef struct _struct1
{
UINT8 first : 1;
UINT8 second : 1;
UINT8 third : 1;
UINT8 fourth : 1;
UINT8 fifth : 1;
UINT16 pad : 11;
} struct1;

And I got the same value (sizeof == 3).

----------

_______________________________________
Python tracker <report@bugs.python.org>
<http://bugs.python.org/issue11920>
_______________________________________

AltStyle によって変換されたページ (->オリジナル) /