Re: Largest size array in Gnat 2005 for the PC?
- From: Adam Beneschan <adam@xxxxxxxxxx>
- Date: Tue, 30 Oct 2007 13:17:17 -0700
On Oct 30, 12:26 pm, Georg Bauhaus <rm.tsoh
+bauh...@xxxxxxxxxxxxxxxxxx> wrote:
On Tue, 2007-10-30 at 02:47 -0700, Ludovic Brenta wrote:
Pascal Obry wrote:
ME a crit :
In short, the answer is: "it depends" :)What is the largest array (in storage units) that you can declare in Gnat
2005 for the PC?
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?
EAX is a 32-bit register, right? (We weren't told what processor
Georg is running on---but the above looks like Pentium/80x86 to me.)
So to assign into the first element of Fst, the offset from the
beginning of the array is 0; to assign into the last element, the
offset will be (2**48 - 2**40) which is 255 * 2**40, which is way too
big to fit into a 32-bit register, so apparently the compiler is
truncating to 0 before setting EAX. The same would happen when it
reads from the array to print the result, so that's why you're
seeing ?? as output.
But you're declaring an array object X of size 255*(2**40), which
can't be handled on a machine with a 32-bit address space; so I'm
confused about why you'd expect the program to work, unless one of the
two machines you're referring to has a 64-bit address space and the
compiler is generating incorrect code anyway. Or unless I'm totally
confused as to what you're asking. Anyway, however, this looks like a
compiler bug---if it is unable to generate correct code because of the
array size, it should reject the program.
-- Adam
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;
.
- Follow-Ups:
- Re: Largest size array in Gnat 2005 for the PC?
- From: tmoran
- Re: Largest size array in Gnat 2005 for the PC?
- References:
- Largest size array in Gnat 2005 for the PC?
- From: ME
- Re: Largest size array in Gnat 2005 for the PC?
- From: Ludovic Brenta
- Re: Largest size array in Gnat 2005 for the PC?
- From: Georg Bauhaus
- Largest size array in Gnat 2005 for the PC?
- Prev by Date: Write 4NT / Take Command plugins with Ada
- Next by Date: Re: Largest size array in Gnat 2005 for the PC?
- Previous by thread: Re: Largest size array in Gnat 2005 for the PC?
- Next by thread: Re: Largest size array in Gnat 2005 for the PC?
- Index(es):
Relevant Pages
|