comp.lang.ada
 help / color / mirror / Atom feed
From: "Nick Roberts" <nick.roberts@acm.org>
Subject: Re: The right way to handle this difference in Ada
Date: Thu, 22 Jul 2004 13:07:33 +0100
Date: 2004-07-22T13:07:33+01:00	[thread overview]
Message-ID: <opsbjfyv06p4pfvb@bram-2> (raw)
In-Reply-To: cdo4ic$q8f$1@e3k.asi.ansaldo.it

On Thu, 22 Jul 2004 12:23:09 +0200, vic <ppp@ppp.it> wrote:

> Please consider this type:
>
> type unsigned_int_12_type is range 0..(2*12)-1;
>
> and these 2 variables of the above type:
>
> a: unsigned_int_12_type;
> b: unsigned_int_12_type;
>
> If the code must perform a difference between a and b, say:
>
> c := a-b
>
> 1) which should be the type of c? I think it should be
> something like:
>
> type signed_int_12_type is range -unsigned_int_12'last ..
> unsigned_int_12'last.
>
> Is this right?

I'm guessing that what you really require is to be able to
pack one or more 12-bit integers into a record. Is this
correct?

If it is, the solution to your problem is likely to be this:

    subtype My_Integer is Integer range 0..2**12-1;

    A, B: My_Integer;

    C: Integer range -My_Integer'Last..My_Integer'Last;

    ...

    C := A-B;

    ...

    type My_Record is
       record
          ...
          X, Y: My_Integer;
          ...
       end record;

    for My_Record use
       record
          ...
          X     at 5 range 0..11;
          Y     at 5 range 12..23;
          ...
       end record;

The idea is that you use a standard base type for the
arithmetic, declaring subtypes which restrict the range
as appropriate, and then tell the compiler explicitly
how to squeeze values into 12-bit parts of the record
type. With luck, the compiler will oblige (or tell you
why it cannot).

Des this help?

> 2) And I should rename a "-" operation which gets two signed_int_12_type  
> as operands and returns
> signed_int_12_type as result?

Hopefully the above technique will work for you, and
enable to avoid the need to declare your own arithmetic
operations.

-- 
Nick Roberts



  parent reply	other threads:[~2004-07-22 12:07 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-07-22 10:23 The right way to handle this difference in Ada vic
2004-07-22 11:53 ` Eric Jacoboni
2004-07-22 12:07 ` Nick Roberts [this message]
2004-07-22 13:03 ` Dmitry A. Kazakov
2004-07-22 13:22   ` Eric Jacoboni
2004-07-22 13:34     ` Dmitry A. Kazakov
2004-07-22 13:34 ` Björn Persson
2004-07-22 17:52 ` Georg Bauhaus
2004-07-22 18:10   ` Georg Bauhaus
2004-07-23  3:41 ` Steve
2004-07-23 12:47   ` Marius Amado Alves
2004-07-24  3:14     ` Robert I. Eachus
replies disabled

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