comp.lang.ada
 help / color / mirror / Atom feed
From: christoph.grein@eurocopter.com
Subject: Re: Unconstrained Arrays
Date: Fri, 20 Mar 2009 05:15:57 -0700 (PDT)
Date: 2009-03-20T05:15:57-07:00	[thread overview]
Message-ID: <6337b84b-4696-48cd-8016-e33e2456c6fa@w35g2000yqm.googlegroups.com> (raw)
In-Reply-To: 46281cbb-2804-41e8-87a0-251c9060d4d1@c36g2000yqn.googlegroups.com

On 20 Mrz., 07:45, sjw <simon.j.wri...@mac.com> wrote:
> On Mar 20, 1:53 am, "Peter C. Chapin" <pcc482...@gmail.com> wrote:
>
>
>
> > belteshazzar <gbelteshaz...@gmail.com> wrote innews:386b0e00-a1c6-4c5f-adf7-89b8543d0e2d@c11g2000yqj.googlegroups.com:
>
> > > Unfortuantely this is an optimisation and actually doesn't occur with
> > > optimisation off. (I just ran a test program). I'm told that due to
> > > the significant performance hit of the array initialisers when
> > > optimisation is turned off we can't use that.
>
> > Are those initializers actually necessary?
>
> > type Unconstrained_Array is array(Integer range <>) of Integer;
>
> > My_Array : Unconstrained_Array(-10_000 .. 10_000);
>
> > In the above the array is uninitialized. Yes, you have to provide
> > constraints, but you don't have to initialize the array here (obviously
> > you'll need to do so eventually... perhaps as part of your algorithm). The
> > code you showed use an array aggregate to initialize the array... the
> > constraints where taken from the initializer. However, there are other ways
> > to specify the constraints.
>
> There is a deep language-lawyerly reason (which I don't understand)
> why an array like your My_Array can't be aliased (at any rate in
> Ada95); you have to use the initialize-with-aggregate approach.
> Perhaps that's what leads to the initialize-with-aggregate style.

  type Unconstrained_Array is array ( Integer range <> ) of Integer;
  type Unconstrained_Array_Pointer is access all Unconstrained_Array;

  procedure F (S : in Unconstrained_Array_Pointer);

With the above declarations, the following is illegal:

  V    : aliased Unconstrained_Array (1 .. 10_000);
  V_Ptr: Unconstrained_Array_Ptr := V'[Unchecked_]Access

because V is nominally constrained and the pointer is to nominally
unconstrained objects only.
Thus you have to use

  V    : aliased Unconstrained_Array := (1 .. 10_000 => 0);
  V_Ptr: Unconstrained_Array_Ptr := V'[Unchecked_]Access

Now V is nominally unconstrained, its subtype however is constrained.
The corresponding paragraphs in the RM are admittedly a bit
complicated. See

http://www.christ-usch-grein.homepage.t-online.de/AdaMagica/ThickThin.html

But as was explained to you, you do not need pointers to have call by
reference. The Ada RM specifies exactly for which kind of types you
can rely on call be copy vs call be reference and for which types it
remains unspecified.

For array as yours, it's unspecified - this is because the compile can
then choose the best method. E.g. for a packed boolean array that fits
into a register, call by copy will normally be used for all modes, for
all longer array call be reference for all modes will be used.

There is the famous Robert Dewar rule that no decent compiler does
silly things - and doing a copy of a 10_000 element array surely is
complete nonsense!

Thus use the following and all will be well if you have a decent
compiler. If not, dump it into the bin and complain at the
manufacturer!

  procedure F (S: in Unconstrained_Array);

  V: Unconstrained_Array (-10_000 .. -1);

  F (V);  -- call by reference with any decent compiler




  parent reply	other threads:[~2009-03-20 12:15 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-03-17  0:59 Unconstrained Arrays belteshazzar
2009-03-17  1:49 ` Jeffrey R. Carter
2009-03-17  2:58   ` belteshazzar
2009-03-17  4:15     ` Jeffrey Creem
2009-03-17  5:20     ` Jeffrey R. Carter
2009-03-17 17:56       ` Jeffrey R. Carter
2009-03-17 23:10         ` belteshazzar
2009-03-18 18:31           ` Jeffrey R. Carter
2009-03-20  1:53           ` Peter C. Chapin
2009-03-20  6:45             ` sjw
2009-03-20  9:46               ` Jacob Sparre Andersen
2009-03-20 11:40               ` Jean-Pierre Rosen
2009-03-25 21:11                 ` sjw
2009-03-25 22:30                   ` Robert A Duff
2009-03-25 23:28                     ` Randy Brukardt
2009-03-26  0:03                       ` Jeffrey R. Carter
2009-03-26  1:00                         ` Robert A Duff
2009-03-20 12:15               ` christoph.grein [this message]
2009-03-20 15:45               ` Adam Beneschan
2009-03-23  8:26                 ` belteshazzar
2009-03-25 21:21                 ` sjw
2009-03-25 22:03                   ` Adam Beneschan
2009-03-26  1:32                     ` tmoran
2009-03-27  8:39                   ` Jean-Pierre Rosen
2009-03-27 20:07                     ` sjw
2009-03-29 16:24                     ` sjw
2009-03-27 11:57                   ` Gautier
2009-03-17 15:33     ` Adam Beneschan
2009-03-17 23:00       ` belteshazzar
2009-03-17 20:14 ` anon
  -- strict thread matches above, loose matches on Subject: below --
2001-12-11 17:17 Unconstrained arrays Michael Unverzagt
2001-12-11 18:22 ` Stephen Leake
2001-12-11 18:24 ` Mark Lundquist
1993-08-15  5:01 Alex Blakemore
1993-08-13 21:08 J. Craig Heberle
1993-08-13 12:34 Paul Durbin
1993-08-12 21:23 Robert Dewar
1993-08-12 19:25 Wes Groleau x1240 C73-8
1993-08-12 17:27 agate!howland.reston.ans.net!math.ohio-state.edu!magnus.acs.ohio-state.ed
1993-08-12 16:26 Mark A Biggar
1993-08-12 16:00 Dave Collar d x7468
1993-08-12 15:28 Robert I. Eachus
1993-08-12 15:00 Robert Dewar
1993-08-12 13:03 Raymond Blaak
1993-08-12 12:14 cis.ohio-state.edu!magnus.acs.ohio-state.edu!usenet.ins.cwru.edu!howland.
1993-08-12 12:03 cis.ohio-state.edu!pacific.mps.ohio-state.edu!math.ohio-state.edu!magnus.
1993-08-11 23:42 Kenneth Anderson
1993-08-11 23:40 cis.ohio-state.edu!math.ohio-state.edu!cs.utexas.edu!swrinde!menudo.uh.ed
1993-08-11 22:29 Kenneth Anderson
replies disabled

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