comp.lang.ada
 help / color / mirror / Atom feed
From: Adam Beneschan <adam@irvine.com>
Subject: Re: how to print an array range?
Date: Tue, 26 Jun 2012 10:15:30 -0700 (PDT)
Date: 2012-06-26T10:15:30-07:00	[thread overview]
Message-ID: <28dde5f5-ad96-4d56-8d7b-5d645d74a15c@googlegroups.com> (raw)
In-Reply-To: <jscnv3$9kt$1@speranza.aioe.org>

On Tuesday, June 26, 2012 9:28:21 AM UTC-7, Nasser M. Abbasi wrote:
> On 6/26/2012 10:53 AM, Georg Bauhaus wrote:
> > On 26.06.12 16:24, Nasser M. Abbasi wrote:
> >> But I wanted to see the range of
> >> the first dimension of the Matrix A below. (1..3, 1..3)
> >
> > Specify the ranges you want, for example,
> >
> > A : constant Real_Matrix (1 .. 3, 1 .. 3) :=
> >       (( 1.0,  2.0,  3.0),
> >        ( 4.0,  5.0,  6.0),
> >        ( 7.0,  8.0,  9.0));
> >
> 
> I think I am not explaining myself well.
> 
> I simply wanted to print the range itself, after
> I define a variable. using PUT().
> 
> i.e. in the above, what would one write to
> print  "1..3" for A'range(1) and "1..3" for A'range(2)?
> 
> I am not asking how to specify the range, I know that.
> but to print it, for debugging purposes.
> 
> I can't just type write put(A'range(1)). And when I write
> put(A'first(1)) it prints -2147483648.

If you declare A the way Georg described, then put(A'first(1)) should print 1.

I think you may have a fundamental misunderstanding about arrays in Ada; you seem to think that the language automatically "knows", in some way, that the first index of an array is 1.  That isn't true.  There is no default first index.  (This is unlike some languages like C or Java, where the first index is always 0; I don't know what it is in MATLAB.)  The first index is whatever you tell the compiler it is.  And, as has been pointed out already, if an unconstrained array type is declared with "Integer range <>" as the index, and you set up an aggregate without specifying the first index, the first index will be Integer'first, which is -2147483648 for some Ada compilers (the actual value is compiler-dependent).

So, if you declare

    A : constant Real_Matrix := 
              (( 1.0,  2.0,  3.0), 
               ( 4.0,  5.0,  6.0), 
               ( 7.0,  8.0,  9.0)); 

then the first element is at indexes (-2147483648, -2147483648).  The last one is at (-2147483646, -2147483646).  If you write A(-2147483648, -2147483648) you will get 1.0.  If you write A(1,1) you will get a constraint error.  A'First(1) and A'First(2) are both -2147483648.  A'Last(1) and A'Last(2) are both -2147483646.  A'Range(1) is a shorthand for A'First(1)..A'Last(1).  If you want something that tells you that the "first index" is 1 and the "last index" is 3, you are not going to get it unless you do the math yourself.  (But note that A'Length(1) and A'Length(2) are both 3.)  That's also why you're getting the Constraint_Error in your other post.  If you say 

   for I in A'Range(1) loop

then I will take the values -2147483648, -2147483647, -2147483646; and if you use any of those values as an index into B, which has index ranges (1..3, 1..3), you'll get a Constraint_Error, because none of those big negative values is in the range 1..3.

My apologies if I'm hammering on stuff you already know.  But it just looked to me that you had a misconception about how array index ranges work in Ada, since you seemed perplexed by some of the results you were getting.

                            -- Adam



  parent reply	other threads:[~2012-06-26 17:15 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-06-26 13:47 how to print an array range? Nasser M. Abbasi
2012-06-26 13:54 ` Georg Bauhaus
2012-06-26 14:08   ` Nasser M. Abbasi
2012-06-26 14:24     ` Nasser M. Abbasi
2012-06-26 15:07       ` AdaMagica
2012-06-26 15:53       ` Georg Bauhaus
2012-06-26 16:28         ` Nasser M. Abbasi
2012-06-26 16:58           ` Georg Bauhaus
2012-06-26 17:05           ` John B. Matthews
2012-06-26 17:13             ` Georg Bauhaus
2012-06-26 19:28               ` John B. Matthews
2012-06-26 17:15           ` Adam Beneschan [this message]
2012-06-26 21:31     ` Robert A Duff
2012-06-26 22:17       ` Dmitry A. Kazakov
2012-06-26 22:39       ` Randy Brukardt
     [not found]       ` <33dku79r14uuvmlgpodg9ri7prnq9v5f94@invalid.netcom.com>
2012-06-26 23:13         ` Jeffrey Carter
2012-06-27  6:58           ` Jacob Sparre Andersen
2012-06-26 14:07 ` Dmitry A. Kazakov
2012-06-28  6:59 ` Shark8
replies disabled

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