Re: Largest size array in Gnat 2005 for the PC?



On Tue, 2007-10-30 at 02:47 -0700, Ludovic Brenta wrote:
Pascal Obry wrote:
ME a crit :

What is the largest array (in storage units) that you can declare in Gnat
2005 for the PC?

In short, the answer is: "it depends" :)

Indeed, it depends;-) I thought that declaring an array *type*
of enormous size is not a problem, since there is no object
yet. It isn't a problem. So maybe using portions of the array might
work (when the program is not actually using physical memory.)
I get unexpected results,though, but they are consistently produced
by two unrelated compilers targeting two (seemingly unrelated)
machines!

This is the only hint I have found in the assembly
listing; '?' is $63, '!' is $33, this is for the lines
assigning Fst and Lst in the second declare block below.
Notice the -1 for the stack offset

movl $0, %eax
movb $33, -1(%ebp,%eax) -- ( Fst := '!' )
movl $0, %eax
movb $63, -1(%ebp,%eax) -- ( Lst := '?' )


Is there a bug in the following program or maybe I'm just dense?

with Ada.Text_IO;

procedure stk is

use Ada;

type Big_Index is range 0 .. 2**50;

type A is array (Big_Index range <>) of Character;

begin

-- output is "!?"
declare
X: A (Big_Index range 2**40 .. 2**40 + 10_000);
Fst: Character renames X(X'First);
Lst: Character renames X(X'Last);
begin
Fst := '!';
Lst := '?';

Text_IO.Put(Fst);
Text_IO.Put(Lst);
Text_IO.New_Line;
end;

-- output is "??"
declare
X: A (Big_Index range 2**40 .. 2**48);
Fst: Character renames X(X'First);
Lst: Character renames X(X'Last);
begin
Fst := '!';
Lst := '?';
pragma assert(Fst = '!');

Text_IO.Put(Fst);
Text_IO.Put(Lst);
Text_IO.New_Line;
end;
end stk;



.



Relevant Pages