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.
next prev parent 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