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
next prev parent 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