comp.lang.ada
 help / color / mirror / Atom feed
From: Georg Bauhaus <bauhaus@futureapps.de>
Subject: Re: Why does this work? (overloads)
Date: Thu, 08 Feb 2007 12:34:54 +0100
Date: 2007-02-08T12:34:40+01:00	[thread overview]
Message-ID: <1170934493.5363.63.camel@localhost.localdomain> (raw)
In-Reply-To: <1170931228.165961.8170@m58g2000cwm.googlegroups.com>

On Thu, 2007-02-08 at 02:40 -0800, Jerry wrote:
> Jeffrey R. Carter wrote:
> > Jerry wrote:
> >
> > > Yes, but  time series are usually indexed from 0. Sometimes, the FFT
> > > of a time series is indexed from 0 and sometimes -NN/2 .. NN/2-1. When
> > > one uses a time series in a vector or matrix, conundrums obviously
> > > arise, not only in computer code but in print. I once figured out how
> > > to make Pascal let me have it both ways by declaring both types, one
> > > type indexed 0..NN-1 and the other 1..NN, and then I set a pointer of
> > > one type to an array originally declared with another type. I'm
> > > guessing that Ada doesn't allow this, however.
> >
> > No pointers needed:
> >
> > A : Vector (0 .. N - 1);
> > B : Vector (1 .. A'Length);
> >
> > A := B;
> > B := A;
> >
> > This is called sliding.
> >
> Good point. However, it uses twice the memory, and worse, changes made
> in A are not reflected in B without repeating the assignment A := B
> (correct?) and vice versa. My Pascal trick had neither of these
> problems yet carried boundary checking using either name.

Not sure whether it is what you are after, but you could either use
pointers to a common unconstrained array type, or simply slice renaming
if possible:

with Ada.Text_IO; use Ada;
procedure sp is

    type Index is range 0 .. 666;

    type A is array (Index range <>) of Float;

    c: A(0 .. 3);
    x: A renames c(0 .. 2);
    y: A renames c(1 .. 3);

    function "*"(v, w: A) return Float;
      -- sum of products of pairwise matching components of `v` and `w`
      -- pre: v'length = w'length

    function "*"(v, w: A) return Float is
        result: Float := 0.0;
        j: Index := w'first;
    begin
        pragma assert(v'length = w'length);
        for k in v'range loop
            result := result + v(k) * w(j);
            j := j + 1;
        end loop;
        return result;
    end "*";

    package FIO is new Text_IO.Float_IO(Float);

begin
    FIO.Default_Aft := 2; FIO.Default_Exp := 0;
    c := (1.0, 3.2, 3.7, 2.4);
    FIO.Put(x * y); Text_IO.new_line;
    c(2) := 1.0;
    FIO.Put(x * y); Text_IO.new_line;
    x(2) := -1.3;
    FIO.Put(x * y); Text_IO.new_line;
    y(2) := +1.3;
    FIO.Put(x * y); Text_IO.new_line;
end sp;





  reply	other threads:[~2007-02-08 11:34 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-02-07  4:39 Why does this work? (overloads) Jerry
2007-02-07  6:45 ` AW: " Grein, Christoph (Fa. ESG)
2007-02-07  7:07   ` Jerry
2007-02-07  7:26     ` AW: " Grein, Christoph (Fa. ESG)
2007-02-07 20:43       ` Jerry
2007-02-07 19:09   ` AW: " Jeffrey R. Carter
2007-02-07 21:13     ` Jerry
2007-02-07 21:33       ` Ludovic Brenta
2007-02-07 21:36       ` Randy Brukardt
2007-02-07 19:02 ` Jeffrey R. Carter
2007-02-07 19:21   ` Adam Beneschan
2007-02-07 19:25     ` Adam Beneschan
2007-02-08  0:51       ` Jeffrey R. Carter
2007-02-07 23:12     ` Robert A Duff
2007-02-08  0:49     ` Jeffrey R. Carter
2007-02-07 20:53   ` Jerry
2007-02-08  0:53     ` Jeffrey R. Carter
2007-02-08 10:40       ` Jerry
2007-02-08 11:34         ` Georg Bauhaus [this message]
2007-02-08 12:05         ` AW: " Grein, Christoph (Fa. ESG)
2007-02-08 18:52         ` Jeffrey R. Carter
2007-02-09  0:56         ` Jerry
2007-02-09  1:27         ` tmoran
replies disabled

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