From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.5-pre1 (2020-06-20) on ip-172-31-74-118.ec2.internal X-Spam-Level: X-Spam-Status: No, score=-1.9 required=3.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.5-pre1 Date: 20 Nov 92 20:38:18 GMT From: noc.near.net!inmet!spock!stt@uunet.uu.net (Tucker Taft) Subject: Re: null arrays Message-ID: <1992Nov20.203818.26501@inmet.camb.inmet.com> List-Id: In article dnsurber@lescsse.jsc.nasa.gov (Douglas N. Surber) writes: >In 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