comp.lang.ada
 help / color / mirror / Atom feed
From: "Stuart" <stuart@0.0>
Subject: Re: "Constraint Error: Range Check" That Does Not Always Occur
Date: Thu, 22 Nov 2007 09:47:47 -0000
Date: 2007-11-22T09:47:47+00:00	[thread overview]
Message-ID: <47454c83$1_1@glkas0286.greenlnk.net> (raw)
In-Reply-To: 86ddf1f4-c7be-4729-8480-bae618b6d296@a39g2000pre.googlegroups.com

"DarthBob88" <darthbob88@gmail.com> wrote in message 
news:86ddf1f4-c7be-4729-8480-bae618b6d296@a39g2000pre.googlegroups.com...
> I've been trying to write a program that creates four random numbers,
> to simulate four dice rolling; a D&D simulator, in fact.
> Unfortunately, I occasionally get "raised CONSTRAINT_ERROR : test.adb:
> 22 range check failed" (line 22 is one of the lines to generate a
> random number; it varies between the four). I have been trying to find
> information on how to prevent this error, but I can't find anything
> about it. I'm extremely new to this language, as in I only started
> last week new, so any help would be greatly appreciated. Here follows
> my code, warts and all.
>
> with Ada.Text_IO, Ada.Integer_Text_IO;
> with Ada.Numerics.Discrete_Random;
>
> procedure test is
> subtype Die is Integer range 1..6;
> --Declare that anything of type Die may be
> --an integer, value between 1 and 6, inclusive, and sod-all else.
> subtype Dice is Integer range 3*Die'First .. 3*Die'Last;
> --Declares that Dice may be anything from 3 to 18.
> package Random_Die is new Ada.Numerics.Discrete_Random (Die);
> use Random_Die;
> --Random generator; produces an integer between 1 and 6
> sum : Integer := 0;
> G: Generator;
>     D1 : Dice;
> D2 : Dice;
> D3 : Dice;
> D4 : Dice;
> --Declare four Dice
> begin
> Reset(G);
> D1 := Random(G);
> D2 := Random(G);
> D3 := Random(G);
> D4 := Random(G);
> --I Haven't found the error just yet, but a Constraint_Error
Are you sure you use Random or is it Random_Die!

Look carefully at how you have declared D1..D4 and compare that with the 
declaration of Random/Random_Die.

One side is expecting to get numbers in the range 3..18, the other to 
produce numbers in the range 1..6!

One way you could have detected this at compile time would have been to make 
the types Die and Dice distinct types rather than subtypes.  Learning to 
make 'correct' use of types and subtypes (to detect programming errors 
earlier) is a major part of the Ada paradigm.  At the start it seems an 
awful hassle - but you should find it becomes more natural and creates a 
robust thinking strategy when designing programs.

(Don't forget that Ada allows you to do explicit type conversion when you 
really do want to change from the view of having the score from one die to 
the score from several dice.  The extra program text makes it clear to 
readers/maintainers that the change of view is intentional.  Again this is 
part of the Ada ethos of making programs easier for reviewers/maintainers 
rather than minimize the amount of typing the original author has to do.

-- 
Stuart 





  parent reply	other threads:[~2007-11-22  9:47 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-11-22  6:42 "Constraint Error: Range Check" That Does Not Always Occur DarthBob88
2007-11-22  7:38 ` Damien Carbonne
2007-11-22  9:12   ` anon
2007-11-22  9:56   ` Stephen Leake
2007-11-26 18:38   ` Adam Beneschan
2007-11-22  9:47 ` Stuart [this message]
2007-11-22 14:14 ` Matthew Heaney
2007-11-23  3:48   ` DarthBob88
replies disabled

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