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:35:12 -0500
Date: 2014-07-12T23:35:12-05:00	[thread overview]
Message-ID: <lpt2aa$m7m$1@speranza.aioe.org> (raw)
In-Reply-To: lpt0pj$jc0$1@speranza.aioe.org

Ok, the final scoope. Using slices does not seem
to be worth the trouble. Went back to making
an explicit loop. Much simpler:

--------------------------------------
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 := (others => 0.0);
begin

    for i in 2..next'length-1 loop
       next(i):= now(i-1)+now(i+1);
    end loop;

end foo;
-------------------------------

The above for loop is the one I was trying to
emulate using below. But I'll stick to the
above in Ada, I do not think Ada supports
array operations as easily as Fortran. But it is
ok, the above loop is not too bad. Will live
with it.  (I need to learn Ada better also)

--Nasser
On 7/12/2014 11:09 PM, Nasser M. Abbasi wrote:
> 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:35 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
2014-07-13  4:35   ` Nasser M. Abbasi [this message]
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