comp.lang.ada
 help / color / mirror / Atom feed
From: "Nasser M. Abbasi" <nma@12000.org>
Subject: Re: basic question on adding 2 arrays
Date: Sat, 12 Jul 2014 23:09:13 -0500
Date: 2014-07-12T23:09:13-05:00	[thread overview]
Message-ID: <lpt0pj$jc0$1@speranza.aioe.org> (raw)
In-Reply-To: lpsup7$fpu$1@speranza.aioe.org

On 7/12/2014 10:34 PM, Nasser M. Abbasi wrote:

> ------------------------------------------------
> with Ada.Text_IO;                       use Ada.Text_IO;
>
> procedure foo is
>      nPoints : constant Integer := 100;
>      type grid_type is array (1 .. nPoints) of Float;
>      now : grid_type := (others => 0.0);
>      next: grid_type := now;
>      begin
>        next(2..now'length-1) := 1/2*
>          (now(1..now'length-1)+now(3..now'length));
> end foo;
> --------------------------------------------------
>
> I am basically trying to update an array (this is a finite difference
> scheme).  The error is that "+" is not defined for the grid_type,
> which I understand ofcourse. But wanted to ask if there is a way
> to do this in-line without having to define a method for this.
>
> For example, in Matlab or Fortran something like this works:
>
>      next(2:end-1) = 1/2*(now(1:end-2)+now(3:end));
>

This is what I tried. But after making special
"+" to add the 2 slices of grid_type, by making
new grid_type2 which is 2 elements smaller than
grid_type, how does not tell Ada to move this
grid_type2 into grid_type since they are of
different type?  Do I need another loop for this?

----------------------------
with Ada.Text_IO; use Ada.Text_IO;

procedure foo is
    nPoints : constant Integer := 100;
    type grid_type is array (1 .. nPoints) of Float;
    type grid_type2 is array (1 .. nPoints - 2) of Float;
    now  : grid_type := (others => 0.0);
    tmp:   grid_type2; -- just to do the slices
    next : grid_type := (others => 0.0);

    function "+" (left, right : in grid_type2) return grid_type2 is
       res : grid_type2;
    begin
       for i in grid_type2'Range loop
          res (i) := left (i) + right (i);
       end loop;
       return res;
    end "+";

begin
    tmp :=
      grid_type2 (now (2 .. now'Length - 1)) +
        grid_type2 (now (3 .. now'Length));
    
    next(2..now'length-1) := tmp;  -- stuck on this one ;)
    
end foo;
-----------------------------

I am sure there must be a better way to do all this, I can't
be making new type for each different slice I want to
work with?

--Nasser

  reply	other threads:[~2014-07-13  4:09 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-13  3:34 basic question on adding 2 arrays Nasser M. Abbasi
2014-07-13  4:09 ` Nasser M. Abbasi [this message]
2014-07-13  4:35   ` Nasser M. Abbasi
2014-07-13  6:33   ` Jeffrey Carter
2014-07-13 10:10     ` AdaMagica
2014-07-13 16:25       ` Jacob Sparre Andersen
2014-07-13 21:53       ` Jeffrey Carter
replies disabled

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