comp.lang.ada
 help / color / mirror / Atom feed
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




  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