comp.lang.ada
 help / color / mirror / Atom feed
From: Gerald.Kasner@Physik.Uni-Magdeburg.de (Gerald)
Subject: Re: Memory limits in Ada where Fortran has none
Date: 6 Mar 2005 14:13:13 -0800
Date: 2005-03-06T14:13:13-08:00	[thread overview]
Message-ID: <79567951.0503061413.42aab38e@posting.google.com> (raw)
In-Reply-To: 1110070479.250902.220540@l41g2000cwc.googlegroups.com

"braver" <deliverable@gmail.com> wrote in message news:<1110070479.250902.220540@l41g2000cwc.googlegroups.com>...
> I'm interoperating with a Fortran algorithm using a very large array of
> integers:
> 
>       PARAMETER (NMAX=100000000) ! a hundred million
>       DIMENSION ND(NMAX)
> C ...
> 
> In Ada, I declared it as
> 
>    type Intarray is array (Positive range <>) of Integer;
> 
>    ND: Intarray(1..NMAX); -- (1)
> 
> -- then I get a STORAGE_ERROR right about NMAX is 2_000_000.
> 
> If I do, instead,
> 
>    type Intarray_Ptr is access Intarray;
>    ND: Intarray_Ptr;
> -- ...
>    ND := new Intarray(1..NMAX);
> 
> -- I get the STORAGE_ERROR right about NMAX=256*1024*256, which, given
> the size of Integer as 32 bits, shows the limit of the _total heap size
> in bits_ as the max 32 value.  So it leaves me with a 256 MB heap size,
> or about 67_108_864 elements -- ~2/3 of what I need.
> How do I increase the heap size, if at all possible, or the main memory
> size?
> 
> In GNU f77, the array allocates and works fine, so I thought to import
> it with pragma Import, just as I do with subroutines -- but the linkage
> name for a variable in MAIN__ is not showing in mn main.o!  Any idea
> how to link/import a GNU f77 _variable_ from GNAT?
> 
> Overall, Ada being the language for large systems, I found it
> surprising that Fortran can allocate enough arrays to fill in my
> memory, or even take up virtual memory, while Ada raises
> STORAGE_ERRORs!  I'd like to simply use (1), as in Fortran, and be done
> with it...
> 
> Cheers,
> Alexy

You should dynamically allocate the big array:

with Ada.Text_IO;
use  Ada.Text_IO;

procedure mtest is

NMAX: constant := 3_000_000;

type Intarray is array (Positive range <>) of Integer;
type Intarray_Ptr is access all Intarray;

ND: Intarray_Ptr;
s : Long_Integer;

begin

ND:=new Intarray(1..NMAX);

for i in ND'range loop
    ND(i):=1;
end loop;

s:=0;
for i in ND'range loop
s:=s+Long_Integer(ND(i));
end loop;

Put(Long_Integer'Image(s));

end mtest;
./mtest
 3000000



  parent reply	other threads:[~2005-03-06 22:13 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-03-06  0:54 Memory limits in Ada where Fortran has none braver
2005-03-06  1:09 ` Jeff C
2005-03-06  6:18   ` braver
2005-03-06  9:26     ` Martin Krischik
2005-03-06 16:14       ` braver
2005-03-06 16:28         ` Jeff C
2005-03-06 23:09         ` Craig Carey
2005-03-07  0:36           ` braver
2005-03-07  5:55           ` braver
2005-03-08  5:35             ` braver
2005-03-06 14:09     ` Stephen Leake
2005-03-06  9:33 ` Martin Krischik
2005-03-06 22:13 ` Gerald [this message]
2005-03-06 23:01 ` Dr. Adrian Wrigley
2005-03-07  0:31   ` braver
2005-03-07 12:47     ` Dr. Adrian Wrigley
2005-03-07  9:41   ` Martin Krischik
2005-03-07 11:59     ` Dr. Adrian Wrigley
2005-03-07 12:26       ` Martin Krischik
2005-03-07  0:05 ` Robert A Duff
2005-03-07 18:04   ` braver
2005-03-16 19:41     ` Robert A Duff
2005-03-17 18:49       ` Martin Krischik
2005-03-08 11:24   ` Dr. Adrian Wrigley
2005-03-09  3:39     ` Craig Carey
2005-03-16 17:39       ` Craig Carey
2005-03-16 19:51     ` Robert A Duff
2005-03-16 23:47       ` Dr. Adrian Wrigley
replies disabled

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