comp.lang.ada
 help / color / mirror / Atom feed
From: Adam Beneschan <adam@irvine.com>
Subject: Re: How to put 200 into an integer sub-type of 16 bits (code included)
Date: Wed, 14 Jan 2009 08:08:51 -0800 (PST)
Date: 2009-01-14T08:08:51-08:00	[thread overview]
Message-ID: <d5db2c1e-b782-43c5-8a44-be01d313a2bd@t26g2000prh.googlegroups.com> (raw)
In-Reply-To: f4894476-851e-493f-93a2-168976bd97fb@s1g2000prg.googlegroups.com

On Jan 14, 6:59 am, ChristopherL <clusard...@aol.com> wrote:
> Hello again,
>
> Trying twice, I seem not to be able to get the "Unchecked_Conversion"
> to compile. See below, and explain this to me.
>
> Thanks,
> Chris L.
>
> -- Program (1) --
>
> with Ada.Unchecked_Conversion;
>
> procedure test is
>    subtype Shrt is Integer range -(2 ** 7) .. ((2 ** 7) - 1 );
>    Result:Shrt;
>
>    Arg:Float;
>
>    function To_Bits is new
>       Ada.Unchecked_Conversion (Source => Float, Target => Shrt);
>
> Begin
>    Arg := 200.0;
>
>    Result := To_Bits(Arg + 0.5);  -- crude round then type conversion
> End test;
>
> -- Error Message Received
>
>     210       Ada.Unchecked_Conversion (Source => Float, Target =>
> Shrt);
>
> *** 387E-0: Identifier ADA is not directly visible
>
>     236       Result := To_Bits( Arg + 0.5 )
>
> *** 387E-0: Identifier TO_BITS is not directly visible
>
> ==================================================================
>
> -- Program (2) --
>
> with Unchecked_Conversion;
>
> procedure test is
>    subtype Shrt is Integer range -(2 ** 7) .. ((2 ** 7) - 1 );
>    Result:Shrt;
>
>    Arg:Float;
>
>    function To_Bits is new
>       Unchecked_Conversion (Source => Float, Target => Shrt);
>
> Begin
>    Arg := 200.0;
>
>    Result := To_Bits(Arg + 0.5);  -- crude round then type conversion
> End test;

(1) The error messages don't make any sense to me.  If you say "with
Ada.Unchecked_Conversion", then Ada and Ada.Unchecked_Conversion
should both be visible and you shouldn't be getting "not directly
visible" errors.  You did include the "with" statement in your source
file, right, rather than putting it in another source?  I'd check your
compiler manual here; maybe you didn't configure things properly and
you need to do something special in order to access the Ada standard
library.  I'm just guessing here.  I have no idea what compiler you're
using.

(2) Even if you get past that, your program will not work as
intended.  Unchecked_Conversion simply copies bit representations from
one type to another.  A floating-point type will contain bits in a
floating-point format, and that format won't look like an integer
format.  If Float is an IEEE-standard 32-bit float, the representation
of 200.0 looks like

   01000011010010000000000000000000

If you convert this to Shrt, which is probably 8 bits, the language
doesn't really tell you what happens when you Unchecked_Conversion a
32-bit value to an 8-bit value.  But most likely you'll either get the
upper 8 bits (01000011) or the lower 8 bits (00000000), neither of
which is what you want.

You need a regular type conversion to convert the float to an integer,
not an Unchecked_Conversion.

(3) You still haven't been clear on what you want to do, but it now
looks like you're trying to take an 8-bit integer in the range 0..255
and convert it to an 8-bit Shrt (in the range -128..127) with the same
bit representation.  Did I guess right?  If that's the case, it might
be helpful to do this the simple way:

   type Signed_Short is range -128 .. 127;
     -- more readable than "Shrt", which could be mistaken for
     -- "shirt", or some other word with four letters
   for Signed_Short'Size use 8;

   type Unsigned_Short is range 0 .. 255;
   for Unsigned_Short'Size use 8;

   Arg : Float;
   Unsigned_Result : Unsigned_Short;
   Result : Signed_Short;
begin
   Arg := 200.0;
   Unsigned_Result := Unsigned_Short (Arg + 0.5);
       -- will raise exception if Arg is out of the range 0.0 ..
255.0,
       -- after rounding

   if Unsigned_Result >= 128
      then Result := Signed_Short (Integer(Unsigned_Result) - 256)
      else Result := Signed_Short (Unsigned_Result);
   end if;

(You may have to convert to "Integer" before subtracting 256 because
otherwise Ada may try to use 8-bit integers to do the arithmetic and
then
things will be out of range.)

Or maybe you don't need the Unsigned_Short type:

   if Arg >= 128.0
      then Result := Signed_Short (Arg + 0.5 - 256.0)
      else Result := Signed_Short (Arg + 0.5);
   end if;

Or you can use Unchecked_Conversion if you want:

   function To_Signed_Short is new Unchecked_Conversion
       (Source => Unsigned_Short, Target => Signed_Short);
   ...
begin
   ...
   Unsigned_Result := Unsigned_Short (Arg + 0.5);
   Result := To_Signed_Short (Unsigned_Result);

This seems to be what you want... copying bits from an unsigned
integer to a signed integer.  Not copying bits from a float to an
integer---that is not at all what you're trying to accomplish.

Hope this gives you some idea of how this language works.  It's quite
simple, really.

                              -- Adam





  parent reply	other threads:[~2009-01-14 16:08 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <407ae64d-3cb3-4310-b59e-f1bbae9910a5@t39g2000prh.googlegroups.com>
2009-01-14  1:33 ` How to put 200 into an integer sub-type of 16 bits (code included) Brian Drummond
     [not found]   ` <3d3719f4-355c-4094-9902-495d612d46fe@n33g2000pri.googlegroups.com>
2009-01-14  9:06     ` Ludovic Brenta
2009-01-14 10:08     ` Georg Bauhaus
2009-01-14 10:29       ` Georg Bauhaus
2009-01-14 12:47     ` Brian Drummond
2009-01-14 12:53     ` Brian Drummond
     [not found]       ` <f4894476-851e-493f-93a2-168976bd97fb@s1g2000prg.googlegroups.com>
2009-01-14 16:08         ` Adam Beneschan [this message]
2009-01-14 21:17           ` sjw
     [not found]           ` <139961e9-bae6-4e60-8ff7-4f4779b27481@z6g2000pre.googlegroups.com>
2009-01-14 20:41             ` Adam Beneschan
     [not found]               ` <1a2b31ac-cf6b-44e3-85b7-04594460db87@d36g2000prf.googlegroups.com>
2009-01-14 22:47                 ` Adam Beneschan
2009-01-14 23:11                 ` Ludovic Brenta
2009-01-15  9:56                 ` Stuart
2009-01-15 12:40                 ` Stuart
2009-01-15 14:02                 ` Stephen Leake
2009-01-15 15:54                   ` Dmitry A. Kazakov
2009-01-15 16:29                     ` Hyman Rosen
2009-01-15 22:15                       ` Dmitry A. Kazakov
2009-01-16  9:11                         ` Jacob Sparre Andersen
2009-01-16 11:03                           ` Mike H
2009-01-16 22:16                           ` Brian Drummond
     [not found]               ` <c265ffb7-6159-4d85-b259-78b830e115f9@v18g2000pro.googlegroups.com>
2009-01-15  2:39                 ` SteveD@teranews.com
     [not found]               ` <3625f980-4406-4f51-b494-dd4a48cab840@p36g2000prp.googlegroups.com>
2009-01-15  6:53                 ` Michael Bode
2009-01-15  8:57                   ` Martin
     [not found]               ` <fc154f52-7168-447a-bcd3-6ece9066ebf7@r37g2000prr.googlegroups.com>
2009-01-15 10:29                 ` Georg Bauhaus
2009-01-14 21:32             ` sjw
2009-01-14 21:51             ` Brian Drummond
2009-01-14 18:49     ` Jeffrey R. Carter
2009-01-15 10:12       ` Quote of the Day (Re: " Peter Hermann
2009-01-14 21:09   ` sjw
2009-01-14 21:16     ` Adam Beneschan
2009-01-14 23:09       ` Martin
2009-01-15  0:07         ` Adam Beneschan
2009-01-15  3:09           ` Randy Brukardt
2009-01-15 16:28             ` Adam Beneschan
2009-01-15 21:21               ` Robert A Duff
2009-01-16  1:17                 ` Adam Beneschan
2009-01-16 14:55                   ` Robert A Duff
2009-01-15 14:44     ` Brian Drummond
     [not found]       ` <3f1f2f67-5d69-4baf-8e8c-0d2b5f68475f@p36g2000prp.googlegroups.com>
2009-01-15 16:36         ` How to put 200.0 (is float variable of 32 bits) into an integer sub-type of 10 bits (complete program included) Adam Beneschan
     [not found]         ` <8e64f509-f6fe-4d86-ae1a-fe0b1c88555a@v5g2000pre.googlegroups.com>
2009-01-15 17:09           ` christoph.grein
2009-01-15 17:17             ` Adam Beneschan
2009-01-15 17:29               ` Georg Bauhaus
     [not found]                 ` <09b4a056-688d-49c8-b935-fa0b30f1ae84@w1g2000prk.googlegroups.com>
2009-01-15 18:40                   ` Mike H
     [not found]                     ` <be26729d-9458-42fa-8c8c-004ca33b790d@f33g2000vbf.googlegroups.com>
2009-01-15 20:57                       ` Niklas Holsti
     [not found]                 ` <97231951-54a0-4df7-bb73-04261b34287f@e6g2000vbe.googlegroups.com>
2009-01-16  3:17                   ` Steve D
     [not found]             ` <a61abb30-bc60-4d13-b298-f369ddc8f741@z6g2000pre.googlegroups.com>
2009-01-15 18:15               ` Martin
2009-01-15 18:34               ` Stuart
2009-01-15 17:23           ` Georg Bauhaus
     [not found]         ` <d3b7ad53-af51-4ac5-9167-7cb99e61b2b1@v5g2000pre.googlegroups.com>
2009-01-15 17:50           ` Stuart
     [not found] <6c7964a6-1733-434b-b1b1-962baa4ebba2@p23g2000prp.googlegroups.com>
2009-01-13 21:01 ` How to put 200 into an integer sub-type of 16 bits (code included) Ludovic Brenta
replies disabled

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