comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Interfacing C type, unconstrained array with record
Date: Sat, 16 Oct 2010 20:36:13 +0200
Date: 2010-10-16T20:36:10+02:00	[thread overview]
Message-ID: <xtj9ihygde9q$.t30hjfo8ikh2.dlg@40tude.net> (raw)
In-Reply-To: fb2bbb15-1aff-408e-bada-3b7f4d81fa74@t8g2000yqk.googlegroups.com

On Sat, 16 Oct 2010 10:35:39 -0700 (PDT), Ron Wills wrote:

> Hi all
> 
> I've started learning Ada and started porting some software I had in C/
> C++ as a learning exercise. The software uses SDL, so I started a thin
> wrapper around it. I've been very successful with it, but with the
> exception of the palette structure which in C is defined as:
> 
> typedef struct {
>   int ncolors;
>   SDL_Color colors[]; // Actually is SDL_Color *colors but this is how
> it is laid out in memory
> } SDL_Palette;
> 
> In Ada I'm trying to do something like:
> 
> type SDL_Color is
>   record
>     r, g, b, unused : Uint8;
>   end;
> type SDL_Color_Array is array(Positive range <>) of Color;
> type SDL_Palette is
>   record
>     ncolors : Integer;
>     colors : SDL_Color_Array;
>   end;
> 
> Now Ada (GNAT) won't compile this because the colors component is
> unconstrained, which is understandable. I've been googling for a
> couple of days for a way of modeling this in Ada and still having
> access to all the colors in the colors component. In other SDL
> interface implementations, all I've seen is that the colors component
> is made into a type of "Dummy" component and made more or less
> useless. I've also been combing the reference manual, but nothing I've
> noticed seems to solve this issue. I'm sure I'm not the only one that
> has come across this problem and was wondering what solutions are
> available.

You need a flat array, e.g.

   with Interfaces;  use Interfaces;
   with Interfaces.C;  use Interfaces.C;
      ...
   type SDL_Color is record
      R, G, B, Unused : Unsigned_8;
   end record;
   pragma Convention (C, SDL_Color);
   type SDL_Color_Array is array (Positive) of aliased SDL_Color;
   pragma Convention (C, SDL_Color_Array);
   type SDL_Palette is record
      N_Colors : Int;
      Colors   : SDL_Color_Array;
   end record;
   pragma Convention (C, SDL_Palette);

Now, you cannot directly declare a SDL_Palette variable, because it is too
large. You should do it as you would do in C, i.e. allocate some amount of
memory and then set structure pointer to it. You do not need 'new' or
access types in Ada. It can be on the stack like this:

   with System.Storage_Elements;  use System.Storage_Elements;
      ...
   Raw_Memory : Storage_Array (1..1_024); -- Memory
   Palette    : SDL_Palette;
   for Palette'Address use Raw_Memory'Address;
begin
   Palette.N_Colors := 20;

Of course computing memory size from N_Colors is up to you (as in C).

-- 
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de



  reply	other threads:[~2010-10-16 18:36 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-10-16 17:35 Interfacing C type, unconstrained array with record Ron Wills
2010-10-16 18:36 ` Dmitry A. Kazakov [this message]
2010-10-16 19:19   ` Ron Wills
2010-10-16 22:15     ` Jeffrey Carter
2010-10-17 10:20       ` Simon Wright
2010-10-17 12:38         ` Robert A Duff
2010-10-17  8:35     ` Dmitry A. Kazakov
2010-10-17 12:30       ` Robert A Duff
2010-10-16 21:41   ` Robert A Duff
2010-10-16 23:34     ` tmoran
2010-10-17  6:59     ` J-P. Rosen
2010-10-17 12:34       ` Robert A Duff
2010-10-17  7:45     ` Dmitry A. Kazakov
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox