comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Ada to C interfacing with access on unconstrained array
Date: Wed, 21 Oct 2009 14:14:01 +0200
Date: 2009-10-21T14:14:01+02:00	[thread overview]
Message-ID: <18r2gzef5v3gh.16ftce1bn1zln$.dlg@40tude.net> (raw)
In-Reply-To: 1lisu857l2qte$.1trga8b0qw0fq$.dlg@40tude.net

On Wed, 21 Oct 2009 14:09:51 +0200, Dmitry A. Kazakov wrote:

> On Wed, 21 Oct 2009 02:25:52 -0700 (PDT), dhenry wrote:
> 
>> On 20 oct, 18:11, "Dmitry A. Kazakov" <mail...@dmitry-kazakov.de>
>> wrote:
>>> BTW, why
>>>
>>> � �type Coco_Type is record
>>> � � � X : Integer;
>>> � � � Y : Integer;
>>> � � � Nuts : Nut_Array_Access;
>>> � �end record;
>>>
>>> and not
>>>
>>> � �type Coco_Type (Size : Natural) is record
>>> � � � X : Integer;
>>> � � � Y : Integer;
>>> � � � Nuts : Nut_Array_Type (1..Size);
>>> � �end record;
>> 
>> Well, I quickly tested the discriminant version of Coco_Type with my
>> application needs, and indeed I could use a discriminant to replace
>> the access. So I may reconsider my Coco_Type definition.
>> 
>> Would the discriminant version help me for my Ada->C interfacing?
> 
> No. It could only if the types you use would have C convention of the
> parameters you are dealing with.
> 
> The problem is not how Nut_Array_Type is constrained, but what are its
> elements. For example:
> 
>    type Nut_Type is record
>       Diameter : int;
>       Weight   : int;
>       Age      : int;
>    end record;
>    pragma Convention (C, Nut_Type);
> 
>    type Nut_Type_Ptr is access all Nut_Type;
>    pragma Convention (C, Nut_Type_Ptr);
>    
>    type Nut_Array_Type is array (Positive range <>) of aliased Nut_Type;
>    pragma Convention (C, Nut_Array_Type);
>    
>    procedure Climb_C
>              (  X    : int;
>                 Y    : int;
>                 Nuts : Nut_Type_Ptr;
>                 Len  : unsigned
>              );
>    pragma Export (C, Climb_C);
> 
> This sort of Climb_C can be called from C. Inside it you can call Climb
> passing the array "as-is", provided Climb used the type Nut_Array_Type:
> 
>    procedure Climb (X, Y : int; Nuts : Nut_Array_Type);
> 
>    procedure Climb_C
>              (  X    : int;
>                 Y    : int;
>                 Nuts : Nut_Type_Ptr;
>                 Len  : unsigned
>              )  is
>       subtype Actual_Array_Type is Nut_Array_Type (1..Natural (Len));
>       Actual_Array : Actual_Array_Type;
>       for Actual_Array'Address use Nuts.all'Address;
>    begin
>       Climb (X, Y, Actual_Array);
>          -- Normally, this should not copy Actual_Array upon subtype
>          -- conversion (from Actual_Array_Type to Nut_Array_Type)
>    end Climb_C;

Or so:

   procedure Climb_C
             (  X    : int;
                Y    : int;
                Nuts : Nut_Type_Ptr;
                Len  : unsigned
             )  is
      Actual_Array : Nut_Array_Type (1..Natural (Len));
      for Actual_Array'Address use Nuts.all'Address;
      pragma Import (Ada, Actual_Array);
   begin
      Climb (X, Y, Actual_Array);
   end Climb_C;

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



  reply	other threads:[~2009-10-21 12:14 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-10-20 13:07 Ada to C interfacing with access on unconstrained array dhenry
2009-10-20 16:11 ` Dmitry A. Kazakov
2009-10-21  9:25   ` dhenry
2009-10-21 12:09     ` Dmitry A. Kazakov
2009-10-21 12:14       ` Dmitry A. Kazakov [this message]
2009-10-20 16:24 ` Adam Beneschan
2009-10-20 18:40 ` tmoran
2009-10-21  3:29   ` John B. Matthews
2009-10-21  9:29     ` dhenry
2009-10-21 14:16       ` John B. Matthews
replies disabled

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