From: inhahe on
say i have this definition:

1 typedef struct SDL_Surface {
2 Uint32 flags; /* Read-only */
3 SDL_PixelFormat *format; /* Read-only */
4 int w, h; /* Read-only */
5 Uint16 pitch; /* Read-only */
6 void *pixels; /* Read-write */
7 SDL_Rect clip_rect; /* Read-only */
8 int refcount; /* Read-mostly */
9
10 /* This structure also contains private fields not shown here
*/
11 } SDL_Surface;

notice two pointers, format and pixels.
say format has this definition.


1 typedef struct {
2 SDL_Palette *palette;
3 Uint8 BitsPerPixel;
4 Uint8 BytesPerPixel;
5 Uint8 Rloss, Gloss, Bloss, Aloss;
6 Uint8 Rshift, Gshift, Bshift, Ashift;
7 Uint32 Rmask, Gmask, Bmask, Amask;
8 Uint32 colorkey;
9 Uint8 alpha;
10 } SDL_PixelFormat;

so say i want to create a mock sdl handle and pass it to some library
function that requires an sdl handle. (would it even work? would i
need to use an SDL_SWSURFACE?)

so i make the pixelformat data using struct.pack, and make the surface
data using struct.pack, but how do i link the surface data to the
pixelformat data? if i just use id() it'll give me the memory address
of the "box" for the string and not the string data itself. thanks.
From: Peter Otten on
inhahe wrote:

> say i have this definition:
>
> 1 typedef struct SDL_Surface {
> 2 Uint32 flags; /* Read-only */
> 3 SDL_PixelFormat *format; /* Read-only */
> 4 int w, h; /* Read-only */
> 5 Uint16 pitch; /* Read-only */
> 6 void *pixels; /* Read-write */
> 7 SDL_Rect clip_rect; /* Read-only */
> 8 int refcount; /* Read-mostly */
> 9
> 10 /* This structure also contains private fields not shown here
> */
> 11 } SDL_Surface;
>
> notice two pointers, format and pixels.
> say format has this definition.
>
>
> 1 typedef struct {
> 2 SDL_Palette *palette;
> 3 Uint8 BitsPerPixel;
> 4 Uint8 BytesPerPixel;
> 5 Uint8 Rloss, Gloss, Bloss, Aloss;
> 6 Uint8 Rshift, Gshift, Bshift, Ashift;
> 7 Uint32 Rmask, Gmask, Bmask, Amask;
> 8 Uint32 colorkey;
> 9 Uint8 alpha;
> 10 } SDL_PixelFormat;
>
> so say i want to create a mock sdl handle and pass it to some library
> function that requires an sdl handle. (would it even work? would i
> need to use an SDL_SWSURFACE?)
>
> so i make the pixelformat data using struct.pack, and make the surface
> data using struct.pack, but how do i link the surface data to the
> pixelformat data? if i just use id() it'll give me the memory address
> of the "box" for the string and not the string data itself. thanks.

I think you are looking at the wrong module; you need ctypes, not struct.

http://docs.python.org/library/ctypes.html

Peter
From: inhahe on
On Aug 13, 4:07 pm, Peter Otten <__pete...(a)web.de> wrote:
> inhahe wrote:
> > say i have this definition:
>
> >    1 typedef struct SDL_Surface {
> >    2     Uint32 flags;                           /* Read-only */
> >    3     SDL_PixelFormat *format;                /* Read-only */
> >    4     int w, h;                               /* Read-only */
> >    5     Uint16 pitch;                           /* Read-only */
> >    6     void *pixels;                           /* Read-write */
> >    7     SDL_Rect clip_rect;                     /* Read-only */
> >    8     int refcount;                           /* Read-mostly */
> >    9
> >   10   /* This structure also contains private fields not shown here
> > */
> >   11 } SDL_Surface;
>
> > notice two pointers, format and pixels.
> > say format has this definition.
>
> >    1 typedef struct {
> >    2   SDL_Palette *palette;
> >    3   Uint8  BitsPerPixel;
> >    4   Uint8  BytesPerPixel;
> >    5   Uint8  Rloss, Gloss, Bloss, Aloss;
> >    6   Uint8  Rshift, Gshift, Bshift, Ashift;
> >    7   Uint32 Rmask, Gmask, Bmask, Amask;
> >    8   Uint32 colorkey;
> >    9   Uint8  alpha;
> >   10 } SDL_PixelFormat;
>
> > so say i want to create a mock sdl handle and pass it to some library
> > function that requires an sdl handle. (would it even work? would i
> > need to use an SDL_SWSURFACE?)
>
> > so i make the pixelformat data using struct.pack, and make the surface
> > data using struct.pack, but how do i link the surface data to the
> > pixelformat data?  if i just use id() it'll give me the memory address
> > of the "box" for the string and not the string data itself.  thanks.
>
> I think you are looking at the wrong module; you need ctypes, not struct.
>
> http://docs.python.org/library/ctypes.html
>
> Peter

can you (or anybody) tell me how to link one c struct to another using
ctypes? Thx







From: Peter Otten on
inhahe wrote:

> On Aug 13, 4:07 pm, Peter Otten <__pete...(a)web.de> wrote:
>> inhahe wrote:
>> > say i have this definition:
>>
>> > 1 typedef struct SDL_Surface {
>> > 2 Uint32 flags; /* Read-only */
>> > 3 SDL_PixelFormat *format; /* Read-only */
>> > 4 int w, h; /* Read-only */
>> > 5 Uint16 pitch; /* Read-only */
>> > 6 void *pixels; /* Read-write */
>> > 7 SDL_Rect clip_rect; /* Read-only */
>> > 8 int refcount; /* Read-mostly */
>> > 9
>> > 10 /* This structure also contains private fields not shown here
>> > */
>> > 11 } SDL_Surface;
>>
>> > notice two pointers, format and pixels.
>> > say format has this definition.
>>
>> > 1 typedef struct {
>> > 2 SDL_Palette *palette;
>> > 3 Uint8 BitsPerPixel;
>> > 4 Uint8 BytesPerPixel;
>> > 5 Uint8 Rloss, Gloss, Bloss, Aloss;
>> > 6 Uint8 Rshift, Gshift, Bshift, Ashift;
>> > 7 Uint32 Rmask, Gmask, Bmask, Amask;
>> > 8 Uint32 colorkey;
>> > 9 Uint8 alpha;
>> > 10 } SDL_PixelFormat;
>>
>> > so say i want to create a mock sdl handle and pass it to some library
>> > function that requires an sdl handle. (would it even work? would i
>> > need to use an SDL_SWSURFACE?)
>>
>> > so i make the pixelformat data using struct.pack, and make the surface
>> > data using struct.pack, but how do i link the surface data to the
>> > pixelformat data? if i just use id() it'll give me the memory address
>> > of the "box" for the string and not the string data itself. thanks.
>>
>> I think you are looking at the wrong module; you need ctypes, not struct.
>>
>> http://docs.python.org/library/ctypes.html
>>
>> Peter
>
> can you (or anybody) tell me how to link one c struct to another using
> ctypes? Thx

I know it sounds old-fashioned, but the documentation is worth reading. It
contains examples for structs, pointers and arrays, e. g.

"""
>>> from ctypes import *
>>> class cell(Structure):
.... pass
....
>>> cell._fields_ = [("name", c_char_p),
.... ("next", POINTER(cell))]
>>>
"""

Peter
 | 
Pages: 1
Prev: Python Tutorial
Next: Dump logging configuration