From: Niklas Holsti <niklas.holsti@tidorum.invalid>
Subject: Re: Processing array subsections, a newbie question.
Date: Sun, 13 Jun 2010 09:28:16 +0300
Date: 2010-06-13T09:28:16+03:00 [thread overview]
Message-ID: <87jc41FftrU1@mid.individual.net> (raw)
In-Reply-To: <8739wsottd.fsf@ludovic-brenta.org>
Ludovic Brenta wrote:
> "Peter C. Chapin" <pcc482719@gmail.com> writes:
>> Ok : Boolean := True;
>> Index_Fst : Natural := Buffer'First;
>> Index_Lst : Natural;
>> ...
>>
>> while Ok and Index_Fst <= Buffer'Last loop
>> Do_Something(Buffer, Index_Fst, Index_Lst, Ok);
>> Index_Fst := Index_Lst + 1;
>> end loop;
>>
>> The problem with this code is that the assignment to Index_Fst inside the loop
>> might raise Constraint_Error if Index_Lst = Buffer'Last after Do_Something
>> finishes. I can work around this problem but my solutions tend to be rather
>> ungainly looking. Surely there must be an easy way to handle this.
Constraint_Error would be raised only if Index_Lst = Natural'Last after
Do_Something. By subtyping the index type of Buffer you could ensure
that Buffer'Last < Natural'Last, which would avoid the risk of
Constraint_Error. (Perhaps this is the ungainly work-around that you
mention.)
> How about:
A few nitpicks on Ludovic's suggestion:
> Ok : Boolean := True;
The initial value for Ok is unneccessary, as Do_Something will assign Ok
before it it used.
> Index_Fst : Natural := Buffer'First;
> Index_Lst : Natural;
> ...
> loop
> Do_Something(Buffer, Index_Fst, Index_Lst, Ok);
In this call of Do_Something, Index_Fst may not be a valid index for
Buffer, since there is no preceding check that Index_Fst <= Buffer'Last,
as there was in the original while-loop. But perhaps it is known, in the
original context, that Buffer is not empty.
> exit when not Ok;
> exit when Index_Fst = Buffer'Last;
For robustness I would write Index_Fst >= Buffer'Last. (Perhaps this
could also help some SPARK range analysis.)
> Index_Fst := Index_Lst + 1;
> end loop;
So my suggestion is:
Ok : Boolean;
Index_Fst : Natural := Buffer'First;
Index_Lst : Natural;
...
if Index_Fst <= Buffer'Last then
-- Buffer is not empty, something to be done.
loop
Do_Something(Buffer, Index_Fst, Index_Lst, Ok);
exit when not Ok;
exit when Index_Fst >= Buffer'Last;
Index_Fst := Index_Lst + 1;
end loop;
else
-- Buffer is empty.
...
end if;
--
Niklas Holsti
Tidorum Ltd
niklas holsti tidorum fi
. @ .
next prev parent reply other threads:[~2010-06-13 6:28 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-06-12 19:11 Processing array subsections, a newbie question Peter C. Chapin
2010-06-12 19:38 ` Yannick Duchêne (Hibou57)
2010-06-12 19:41 ` Yannick Duchêne (Hibou57)
2010-06-12 20:54 ` Ludovic Brenta
2010-06-13 1:20 ` Gene
2010-06-13 14:01 ` Peter C. Chapin
2010-06-13 15:48 ` Yannick Duchêne (Hibou57)
2010-06-13 16:57 ` Phil Thornley
2010-06-13 18:39 ` Yannick Duchêne (Hibou57)
2010-06-13 19:04 ` Phil Thornley
2010-06-13 18:58 ` Peter C. Chapin
2010-06-13 6:28 ` Niklas Holsti [this message]
2010-06-13 6:54 ` Jeffrey R. Carter
2010-06-16 19:03 ` Niklas Holsti
2010-06-16 19:22 ` Ludovic Brenta
2010-06-13 14:09 ` Peter C. Chapin
2010-06-13 11:00 ` Stephen Leake
2010-06-13 11:04 ` Simon Wright
2010-06-14 1:45 ` Stephen Leake
2010-06-14 18:23 ` Colin Paul Gloster
2010-06-14 19:41 ` Simon Wright
2010-06-14 23:54 ` Peter C. Chapin
2010-06-15 3:28 ` Jeffrey R. Carter
2010-06-15 6:13 ` Simon Wright
2010-06-15 11:24 ` Peter C. Chapin
2010-06-15 9:45 ` Phil Thornley
2010-06-15 11:27 ` Peter C. Chapin
2010-06-15 12:11 ` Yannick Duchêne (Hibou57)
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox