comp.lang.ada
 help / color / mirror / Atom feed
From: kadavi@most.fw.hac.com (Kirk Davis)
Subject: Re: help - bit twiddling anomoly
Date: 1996/05/13
Date: 1996-05-13T00:00:00+00:00	[thread overview]
Message-ID: <DrCrEs.L61@most.fw.hac.com> (raw)
In-Reply-To: 3193C6C3.7FEC@ccgate.hac.com


Dave Wright <wdwright@ccgate.hac.com> wrote:

>Any ideas why the following code behaves strangely (other than the 
>fact that its SUN SPARCworks Ada 2.1.1 running on a SPARC5 with 
>Solaris 2.4)?  The only difference between the working version and the
>broken version is 8 bits of storage (string(1..2) versus character) in
>the unused object wdw.

>TIA,
>Dave 

>with unchecked_conversion;
>with v_i_bits;
>procedure testc is

>type onebit is record
>bit1: integer range 0..1;
>end record;
>for onebit'size use 1;
>pragma bit_pack(onebit);

>type fourteenbit is record
>value: integer range 0..16383;
>end record;
>for fourteenbit'size use 14;
>pragma bit_pack(fourteenbit);

>type br is record
>bit0:   onebit;
>bit1:   onebit;
>bit2_15: fourteenbit;
>end record;
>for br use
>record at mod 1;
>bit0   at 0 range 0..0;
>bit1   at 0 range 1..1;
>bit2_15 at 0 range 2..15;
>end record;
>for br'size use 16;
>pragma bit_pack(br);

>int:  integer;
>brec: br;

>-- with 2 bytes of data declared for wdw it works.
>-- with 1 byte it doesn't.
>wdw: string (1..2); -- with this declared it works :-)
>--wdw: character; -- with this declared it doesn't work :-(
>-- when it works brec.bit0 = 1
>-- when it doesn't work brec.bit0  = 0.

>function inttobit is new
>unchecked_conversion (source=>integer, target=>onebit);
>function intto14bit is new
>unchecked_conversion (source=>integer, target=>fourteenbit);
I'm suprised that the compiler does not complain that your source and
targets for these unchecked_conversions are not the same sizes. How
does the compiler know which of the integers bits are to be
converted(14 most significat bits, 14 least significant or some where
in-between)?

>begin

>int := 1;
>brec.bit0 := inttobit(v_i_bits.bit_sll(int,(integer'size-onebit'size)));
Why do an unchecked converstion here? v_i_bits.bit_sll is returning an
integer and brec.bit0.bit1 is an integer just do an assignment.

>int := 1;
>brec.bit1 := inttobit(v_i_bits.bit_sll(int,(integer'size-onebit'size)));

>int := 16383;
>brec.bit2_15 :=
>intto14bit(v_i_bits.bit_sll(int,(integer'size-fourteenbit'size)));

>end testc;
It looks like the unchecked_conversion is dropping the unused bits
into the objects declared after the target objects (especially if
integers on a Sun are 32 bits).  











  parent reply	other threads:[~1996-05-13  0:00 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1996-05-10  0:00 help - bit twiddling anomoly Dave Wright
1996-05-11  0:00 ` Robert A Duff
1996-05-11  0:00 ` Theodore E. Dennison
1996-05-13  0:00 ` Kirk Davis [this message]
1996-05-13  0:00 ` Marc Bouvette
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox