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
next prev 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