From: "jimmaureenrogers@worldnet.att.net" <jimmaureenrogers@worldnet.att.net>
Subject: Re: GNAT 4.0 strange behaviour
Date: 11 Sep 2005 17:36:52 -0700
Date: 2005-09-11T17:36:52-07:00 [thread overview]
Message-ID: <1126485412.479800.227880@o13g2000cwo.googlegroups.com> (raw)
In-Reply-To: 4324c57b$0$17248$8fcfb975@news.wanadoo.fr
James wrote:
> This is a very small program compiled under linux debian with gnat 4
> based on gcc 4.0
> The output of the program is
> 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
> 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> which is of course not right...
> If line labelled 1 is removed and replaced by line labelled 2, the
> output is correct.
> The output is also correct if part 1 is replaced by part 2.
> Any advice or place where I could send a bug report?
>
> with Text_Io;
> use Text_Io;
> with Interfaces;
> use Interfaces;
>
>
> procedure Toto is
> type Intboard is new Unsigned_64;
> for Intboard'Size use 64;
> type Bit is new Integer range 0..1;
> for Bit'Size use 1;
You seem to think that Bit is an unsigned type.
It is not. It is a derived type from Integer, which is a
signed type.
If you want an unsigned integer with a range of 0..1
you should declare:
type Bit is mod 2;
Ada unsigned integer types are defined using modular types.
I am willing to bet the answer will improve if you use a
modular type.
Strictly speaking, the subtypes used in part 1 below do not
match the subype used in Bitboard array index definition.
The part 1 approach to indexing look suspiciuosly like C coding
logic. The part 2 approach is closer to a classical Ada.
The most correct and maintainable approach to the looping
is:
for I in A_B'Range loop
A_B(I) := 1;
Put(Bit'Image(A-B(I)));
end loop;
Clearly your goal is to set each element of A_B to 1 and
then print a string representation of that element. The
approack shown above will correctly satisfy that goal even
if the index range of A_B should change sometime in the
future due to changes in system requirements.
> type Bitboard is array (0..63) of Bit;
> pragma Pack(Bitboard);
> for Bitboard'Size use 64;
>
> A_B : Bitboard;
> A_I : Intboard;
> for A_I'Address use A_B'Address; --label1
> -- for A_B'Address use A_I'Address; --label2
>
> begin
> --part 1
> for I in 0 .. 7 loop
> for J in 0 .. 7 loop
> A_B(I*8+J) := 1;
> Put(Bit'Image(A_B(I*8+J)));
> end loop;
> end loop;
>
> --part 2
> -- for I in 0 .. 63 loop
> -- A_B(I) := 1;
> -- Put(Bit'Image(A_B(I)));
> -- end loop;
> end Toto;
Jim Rogers
next prev parent reply other threads:[~2005-09-12 0:36 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-09-12 0:02 GNAT 4.0 strange behaviour James
2005-09-12 0:36 ` jimmaureenrogers [this message]
2005-09-12 5:11 ` Simon Wright
2005-09-12 16:11 ` James
2005-09-12 16:16 ` James
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox