comp.lang.ada
 help / color / mirror / Atom feed
From: "Randy Brukardt" <randy@rrsoftware.com>
Subject: Re: discriminant in constraint must appear alone
Date: Tue, 2 Dec 2003 14:56:18 -0600
Date: 2003-12-02T14:56:18-06:00	[thread overview]
Message-ID: <vspv69c17kr14c@corp.supernews.com> (raw)
In-Reply-To: bqiq1m$uis$00$1@news.t-online.com

"Vincent Smeets" <No.Spam@T-Online.de> wrote in message
news:bqiq1m$uis$00$1@news.t-online.com...
> Hallo,
>
> I want to define a discriminated record type with two arrays. One array
only half the size
> of the other. Below is the type definition that I want to use.
>
>   type R (D : Positive) is
>      record
>         A : String (1 .. D);
>         B : String (1 .. D / 2);
>      end record;
>
> This type definition can't be compiled by the GNAT compiler. It gives the
error message
>    "discriminant in constraint must appear alone"
>for the record component B. I know this isn't correct Ada, but how should I
define the type
>in a correct way?

I don't think you can.

>I have defined B as
>    B : String (1 .. D);
>and only used the first half of it, but this way I waist memory and can't
have any Ada
>constraint checks for component B. So this is not the way I want to do it.
>
>Are there other possiblities?

The only thing that comes to mind is to have a second discriminant. The
problem with that is that the relationship between them can't be defined
formally.

   type R (D1, D2 : Positive) is
     record
        A : String (1 .. D1);
        B : String (1 .. D2);
     end record;

  Obj : R (Max_Size, Max_Size/2);

I suppose you could have Initialize check if they don't match and raise an
exception:

   type R (D1, D2 : Positive) is new Ada.Finalization.Controlled with
     record
        A : String (1 .. D1);
        B : String (1 .. D2);
     end record;

   procedure Initialize (Obj : in out R);

   procedure Initialize (Obj : in out R) is
   begin
      if Obj.D1 /= Obj.D2*2 then
          raise Constraint_Error;
         -- Or better Ada.Exceptions.Raise_with_Message
(Constraint_Error'Identity, "D2 is not half of D1");
      end if;
   end Initialize;

  Obj : R (Max_Size, Max_Size/2);
  Obj2 : R (Max_Size, Max_Size); -- Would raise Constraint_Error.

But that seems like a lot of mechanism for a simple check. (OTOH, my theory
is that virtually all types ought to be derived from Controlled or
Limited_Controlled anyway, so this doesn't add much in that case.)

                      Randy.






  reply	other threads:[~2003-12-02 20:56 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-12-02 19:43 discriminant in constraint must appear alone Vincent Smeets
2003-12-02 20:56 ` Randy Brukardt [this message]
2003-12-02 21:15   ` tmoran
2003-12-03  9:06     ` Dmitry A. Kazakov
2003-12-03  0:06 ` Robert I. Eachus
2003-12-03 21:02 ` Vincent Smeets
2003-12-04 19:16   ` Randy Brukardt
2003-12-05  0:56     ` info version of Ada Reference Manual Stephen Leake
2003-12-05  1:08       ` Stephane Richard
2003-12-05  1:27       ` Ludovic Brenta
2003-12-05  4:36       ` Fionn mac Cuimhaill
2003-12-05  5:28         ` [Totally OT] Nick Roberts
2003-12-05 14:07         ` info version of Ada Reference Manual Stephen Leake
2003-12-05 14:18       ` Arthur Evans Jr
2003-12-05 14:52         ` Stephen Leake
2003-12-07 15:22           ` Arthur Evans Jr
2003-12-05 14:28       ` Georg Bauhaus
replies disabled

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