comp.lang.ada
 help / color / mirror / Atom feed
From: noc.near.net!inmet!spock!stt@uunet.uu.net  (Tucker Taft)
Subject: Re: null arrays
Date: 20 Nov 92 20:38:18 GMT	[thread overview]
Message-ID: <1992Nov20.203818.26501@inmet.camb.inmet.com> (raw)

In article <dnsurber.722098125@node_26400> 
  dnsurber@lescsse.jsc.nasa.gov (Douglas N. Surber) writes:

>In <BxvtCA.LM1@dale.cts.com> jhb@dale.cts.com (John Bollenbacher) writes:
>
>>procedure TEST is
>
>>  subtype T is NATURAL range 0 .. 10;
>
>>  type ARR is array (T range <>) of BOOLEAN;
>>  
>>  type A(N : T := 0) is record 
>>    DATA : ARR(1..N);
>>  end record;  
>>  I : INTEGER;
>>  O : A := (3, (TRUE, FALSE, TRUE));
>>  
>>  N1 : constant ARR := O.DATA(1..0) & O.DATA(1..0);
>>  N2 : constant ARR := O.DATA(1..0) & O.DATA(3..2);
>
>N2'first = 3 (LRM 4.5.3 4)
>
>>begin
>>  I := N1'LENGTH; -- I = 0 
>>  I := N2'LENGTH; -- I = 0
>>  O := (0, N1);   -- does not raise constraint
>>  O := (0, N2);   -- raises constraint
> 
>O.Data'first /= N2'first thus raises constraint error (LRM 4.3.1 3, 3.3 4)
>
>>end TEST; 
>
>The trick here is that the constraint error is raised in forming the
>aggregate, not in the assignment.  LRM 4.3.1 3 says "A check is made that
>the value of each subcomponent of the aggregate _belongs_ to the subtype
>of this component."  The magic word is "belongs".  LRM 3.3 4 says "a value
>is said to belong to a subtype of a given type if it belongs to the type
>and satisfies the constraint." The bounds of N2, i.e. 3 and 2, do not
>satisfy the constraint of the aggregate, i.e. in the range 1 .. 0.  If this
>were an array assignment rather than an aggregate, it would work.

This problem is alleviated in Ada 9X by providing "sliding" (implicit
array subtype conversion) in essentially all contexts where
it might be useful.  In particular, in Ada 9X, the bounds of
N2 (i.e. 3..2) would "slide" to match the bounds of the DATA
component (i.e. 1..0) as part of constructing the aggregate.

Until you convince your implementor to provide a "-9X" mode
in their compiler ;-), you might want to define a function that "slides"
its parameter and then returns it.  For example, here is a function
that slides its parameter to have a low bound of 1 (if needed, you
could define one that took the low bound desired as an additional
parameter):

   function Slide(A : ARR) return ARR is
       subtype S is ARR(1..A'Length);
   begin
       return S(A);  -- Explicit array subtype conversion
   end Slide;

A "pragma INLINE" might be appropriate here.

>Douglas Surber
>Lockheed
>Houston, TX

S. Tucker Taft    stt@inmet.com
Ada 9X Mapping/Revision Team
Intermetrics, Inc.
Cambridge, MA  02138

             reply	other threads:[~1992-11-20 20:38 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1992-11-20 20:38 Tucker Taft [this message]
  -- strict thread matches above, loose matches on Subject: below --
1992-11-18 14:48 null arrays Douglas N. Surber
1992-11-18 13:22 cis.ohio-state.edu!zaphod.mps.ohio-state.edu!saimiri.primate.wisc.edu!apl
replies disabled

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