* index check failure - constraint error
@ 2011-04-01 10:53 tonyg
2011-04-01 11:07 ` tonyg
` (2 more replies)
0 siblings, 3 replies; 18+ messages in thread
From: tonyg @ 2011-04-01 10:53 UTC (permalink / raw)
I'm getting a constraint error and I cannot see why...
function String_To_Integer (The_String : String) return Integer is
String_Length : Integer := The_String'length;
Return_Value : Integer := 0;
subtype Number_Character is character range '0'..'9';
begin
Int_Io.Put(String_Length);
Ada.Text_IO.Put_Line (The_String);
if String_Length > 0 then
for count in 1..String_Length loop
case The_String(count) is
when Number_Character =>
Return_Value := Return_Value +
((Character'pos(The_String(count)) - 48) *
(10**(count-1)));
when others =>
raise Conversion_Error_Exception;
end case;
end loop;
else
Return_Value := 0;
end if;
return Return_Value;
end String_To_Integer;
I checked to see there was a string going in and it had a length. The
actual error was 'index check failure' but as far as I can see
everything is present and correct. Can anyone see what it is ?
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: index check failure - constraint error
2011-04-01 10:53 index check failure - constraint error tonyg
@ 2011-04-01 11:07 ` tonyg
2011-04-01 11:27 ` Alex Mentis
2011-04-01 11:12 ` Egil Høvik
2011-04-01 17:39 ` Jeffrey Carter
2 siblings, 1 reply; 18+ messages in thread
From: tonyg @ 2011-04-01 11:07 UTC (permalink / raw)
On Apr 1, 11:53 am, tonyg <tonytheg...@gmail.com> wrote:
> I'm getting a constraint error and I cannot see why...
>
> function String_To_Integer (The_String : String) return Integer is
> String_Length : Integer := The_String'length;
> Return_Value : Integer := 0;
> subtype Number_Character is character range '0'..'9';
> begin
> Int_Io.Put(String_Length);
> Ada.Text_IO.Put_Line (The_String);
> if String_Length > 0 then
> for count in 1..String_Length loop
> case The_String(count) is
> when Number_Character =>
> Return_Value := Return_Value +
> ((Character'pos(The_String(count)) - 48) *
> (10**(count-1)));
> when others =>
> raise Conversion_Error_Exception;
> end case;
> end loop;
> else
> Return_Value := 0;
> end if;
>
> return Return_Value;
>
> end String_To_Integer;
>
> I checked to see there was a string going in and it had a length. The
> actual error was 'index check failure' but as far as I can see
> everything is present and correct. Can anyone see what it is ?
The index check failure occurred at
case The_String(count) is
btw
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: index check failure - constraint error
2011-04-01 10:53 index check failure - constraint error tonyg
2011-04-01 11:07 ` tonyg
@ 2011-04-01 11:12 ` Egil Høvik
2011-04-01 11:17 ` tonyg
2011-04-01 17:39 ` Jeffrey Carter
2 siblings, 1 reply; 18+ messages in thread
From: Egil Høvik @ 2011-04-01 11:12 UTC (permalink / raw)
In your loop you assume The_String'First=1,
that may not always be the case, especially if
you call this function on array slices.
Try "for count in The_String'Range loop" instead
--
~egilhh
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: index check failure - constraint error
2011-04-01 11:12 ` Egil Høvik
@ 2011-04-01 11:17 ` tonyg
2011-04-01 12:13 ` Ludovic Brenta
2011-04-01 15:02 ` Adam Beneschan
0 siblings, 2 replies; 18+ messages in thread
From: tonyg @ 2011-04-01 11:17 UTC (permalink / raw)
On Apr 1, 12:12 pm, Egil Høvik <egilho...@hotmail.com> wrote:
> In your loop you assume The_String'First=1,
> that may not always be the case, especially if
> you call this function on array slices.
> Try "for count in The_String'Range loop" instead
>
> --
> ~egilhh
Worked a treat - still don't understand why the first character in the
string is not 1 though,
Thanks for the help
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: index check failure - constraint error
2011-04-01 11:07 ` tonyg
@ 2011-04-01 11:27 ` Alex Mentis
2011-04-01 11:33 ` Alex Mentis
` (2 more replies)
0 siblings, 3 replies; 18+ messages in thread
From: Alex Mentis @ 2011-04-01 11:27 UTC (permalink / raw)
tonyg wrote:
> On Apr 1, 11:53�am, tonyg <tonytheg...@gmail.com> wrote:
> > I'm getting a constraint error and I cannot see why...
> >
> > � �function String_To_Integer (The_String : String) return Integer
> > is � � � String_Length : Integer := The_String'length;
> > � � � Return_Value : Integer := 0;
> > � � � subtype Number_Character �is character range '0'..'9';
> > � �begin
> > � � � � Int_Io.Put(String_Length);
> > � � � Ada.Text_IO.Put_Line (The_String);
> > � � � if String_Length > 0 then
> > � � � for count in 1..String_Length loop
> > � � � � �case The_String(count) is
> > � � � � � � when Number_Character =>
> > � � � � � � � �Return_Value := Return_Value +
> > � � � � � � � � �((Character'pos(The_String(count)) - 48) *
> > (10**(count-1)));
> > � � � � � � when others =>
> > � � � � � � � �raise Conversion_Error_Exception;
> > � � � � �end case;
> > � � � � �end loop;
> > � � � else
> > � � � � �Return_Value := 0;
> > � � � end if;
> >
> > � � � return Return_Value;
> >
> > � �end String_To_Integer;
> >
> > I checked to see there was a string going in and it had a length.
> > The actual error was 'index check failure' but as far as I can see
> > everything is present and correct. Can anyone see what it is ?
>
> The index check failure occurred at
>
> case The_String(count) is
>
> btw
Any particular reason you aren't using the Ada-provided Get procedure
that converts a String to an Integer? It operates just like the usual
Get procedure, consuming all Integer-valid characters and stopping when
it gets to a non-digit, but you can make it detect and throw your
constraint with something like this:
with Ada.Text_Io, Ada.Integer_Text_Io;
use Ada.Text_Io;
Procedure Main is
Conversion_Error_Exception : exception;
Input1 : String := "123";
Input2 : String := "1E3";
Input3 : String := "12ab3";
My_Int : Integer;
Length : Positive;
begin
Ada.Integer_Text_Io.Get (Input1, My_Int, Length);
if Length /= Input1'Length then
raise Conversion_Error_Exception;
else
Ada.Integer_Text_Io.Put (My_Int, 0);
New_Line;
end if;
Ada.Integer_Text_Io.Get (Input2, My_Int, Length);
if Length /= Input2'Length then
raise Conversion_Error_Exception;
else
Ada.Integer_Text_Io.Put (My_Int, 0);
New_Line;
end if;
Ada.Integer_Text_Io.Get (Input3, My_Int, Length);
if Length /= Input3'Length then
raise Conversion_Error_Exception;
else
Ada.Integer_Text_Io.Put (My_Int, 0);
New_Line;
end if;
end Main;
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: index check failure - constraint error
2011-04-01 11:27 ` Alex Mentis
@ 2011-04-01 11:33 ` Alex Mentis
2011-04-01 11:36 ` Alex Mentis
2011-04-01 12:18 ` Georg Bauhaus
2 siblings, 0 replies; 18+ messages in thread
From: Alex Mentis @ 2011-04-01 11:33 UTC (permalink / raw)
Alex Mentis wrote:
> It operates just like the usual
> Get procedure, consuming all Integer-valid characters and stopping
> when it gets to a non-digit
** Edit: stopping when it gets to a character that is not valid for an
Integer (some non-digit characters, such as 'E', are allowed in Integer
representations)
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: index check failure - constraint error
2011-04-01 11:27 ` Alex Mentis
2011-04-01 11:33 ` Alex Mentis
@ 2011-04-01 11:36 ` Alex Mentis
2011-04-01 12:18 ` Georg Bauhaus
2 siblings, 0 replies; 18+ messages in thread
From: Alex Mentis @ 2011-04-01 11:36 UTC (permalink / raw)
Alex Mentis wrote:
> you can make it detect and throw your
> constraint
Edit 2: that should be "but you can make it detect and raise your
exception"
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: index check failure - constraint error
2011-04-01 11:17 ` tonyg
@ 2011-04-01 12:13 ` Ludovic Brenta
2011-04-01 15:02 ` Adam Beneschan
1 sibling, 0 replies; 18+ messages in thread
From: Ludovic Brenta @ 2011-04-01 12:13 UTC (permalink / raw)
tonyg wrote on comp.lang.ada:
> On Apr 1, 12:12 pm, Egil Høvik <egilho...@hotmail.com> wrote:
>
>> In your loop you assume The_String'First=1,
>> that may not always be the case, especially if
>> you call this function on array slices.
>> Try "for count in The_String'Range loop" instead
Well spotted.
> Worked a treat - still don't understand why the first character in the
> string is not 1 though,
> Thanks for the help
S : constant String := "***123***";
I : constant Integer := String_To_Integer (S (4 .. 6));
Inside String_To_Integer, The_String'First=4. S (4 .. 6) is called a
"slice".
--
Ludovic Brenta.
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: index check failure - constraint error
2011-04-01 11:27 ` Alex Mentis
2011-04-01 11:33 ` Alex Mentis
2011-04-01 11:36 ` Alex Mentis
@ 2011-04-01 12:18 ` Georg Bauhaus
2011-04-01 22:20 ` tonyg
2 siblings, 1 reply; 18+ messages in thread
From: Georg Bauhaus @ 2011-04-01 12:18 UTC (permalink / raw)
On 01.04.11 13:27, Alex Mentis wrote:
> Any particular reason you aren't using the Ada-provided Get procedure
> that converts a String to an Integer?
I'll guess that it is has to do with the good idea to
do the exercises from chapter 1 of K&R.
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: index check failure - constraint error
2011-04-01 11:17 ` tonyg
2011-04-01 12:13 ` Ludovic Brenta
@ 2011-04-01 15:02 ` Adam Beneschan
1 sibling, 0 replies; 18+ messages in thread
From: Adam Beneschan @ 2011-04-01 15:02 UTC (permalink / raw)
On Apr 1, 4:17 am, tonyg <tonytheg...@gmail.com> wrote:
> On Apr 1, 12:12 pm, Egil Høvik <egilho...@hotmail.com> wrote:
>
> > In your loop you assume The_String'First=1,
> > that may not always be the case, especially if
> > you call this function on array slices.
> > Try "for count in The_String'Range loop" instead
>
> > --
> > ~egilhh
>
> Worked a treat - still don't understand why the first character in the
> string is not 1 though,
> Thanks for the help
A String is an array (of Character), and like any array, it can have
any bounds you give it. (Well, not quite: a non-empty String's bounds
have to be 1 or greater. But you can declare a string like:
S : String (10 .. 20);
and if you pass S to this routine, S'First will be 10 and S'Last will
be 20, and S'Length will be 11. Does that make more sense? Also,
others have mentioned the ability to take a slice of an array,
including a String.)
-- Adam
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: index check failure - constraint error
2011-04-01 10:53 index check failure - constraint error tonyg
2011-04-01 11:07 ` tonyg
2011-04-01 11:12 ` Egil Høvik
@ 2011-04-01 17:39 ` Jeffrey Carter
2011-04-01 22:16 ` tonyg
2 siblings, 1 reply; 18+ messages in thread
From: Jeffrey Carter @ 2011-04-01 17:39 UTC (permalink / raw)
On 04/01/2011 03:53 AM, tonyg wrote:
>
> I'm getting a constraint error and I cannot see why...
In addition to the Get procedures from Ada.Text_IO.*_IO (Integer_IO, Modular_IO,
Float_IO, and Fixed_IO), there's also <type>'Value to convert a String
representation to a numeric type. 'Value is less flexible than Get, but is a
function rather than a procedure. Both will handle values like "1E4".
As others have pointed out, and as I noticed as soon as I looked at your code,
not all Strings have a lower bound of 1, and that is probably why this raises
Constraint_Error. If you showed the calling code we could explain it more fully.
Using 'Range avoids this; that's why it exists.
In addition, I would comment that The_String'Length cannot be negative, so
String_Length should be Natural rather than Integer to indicate this, and since
its value never changes, it should be a constant:
String_Length : constant Natural := The_String'Length;
(Personally, I'd call this
function Value (Image : in String) return Integer;
and just use Image'Length.)
There's no need for the "if" checking the length; the loop will execute zero
times if the String is null, giving a result of zero (which I think is incorrect).
Finally, I think you have a logic error. Given input of "123" with subtype
String (1 .. 3), it returns
1 * 10 ** 0 + 2 * 10 ** 1 + 3 * 10 ** 2 /= 123.
--
Jeff Carter
"Saving keystrokes is the job of the text editor,
not the programming language."
Preben Randhol
64
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: index check failure - constraint error
2011-04-01 17:39 ` Jeffrey Carter
@ 2011-04-01 22:16 ` tonyg
2011-04-01 22:31 ` Jeffrey Carter
0 siblings, 1 reply; 18+ messages in thread
From: tonyg @ 2011-04-01 22:16 UTC (permalink / raw)
On Apr 1, 6:39 pm, Jeffrey Carter <spam.jrcarter....@spam.not.acm.org>
wrote:
> On 04/01/2011 03:53 AM, tonyg wrote:
>
>
>
> > I'm getting a constraint error and I cannot see why...
>
> In addition to the Get procedures from Ada.Text_IO.*_IO (Integer_IO, Modular_IO,
> Float_IO, and Fixed_IO), there's also <type>'Value to convert a String
> representation to a numeric type. 'Value is less flexible than Get, but is a
> function rather than a procedure. Both will handle values like "1E4".
>
> As others have pointed out, and as I noticed as soon as I looked at your code,
> not all Strings have a lower bound of 1, and that is probably why this raises
> Constraint_Error. If you showed the calling code we could explain it more fully.
> Using 'Range avoids this; that's why it exists.
>
> In addition, I would comment that The_String'Length cannot be negative, so
> String_Length should be Natural rather than Integer to indicate this, and since
> its value never changes, it should be a constant:
>
> String_Length : constant Natural := The_String'Length;
>
> (Personally, I'd call this
>
> function Value (Image : in String) return Integer;
>
> and just use Image'Length.)
>
> There's no need for the "if" checking the length; the loop will execute zero
> times if the String is null, giving a result of zero (which I think is incorrect).
>
> Finally, I think you have a logic error. Given input of "123" with subtype
> String (1 .. 3), it returns
>
> 1 * 10 ** 0 + 2 * 10 ** 1 + 3 * 10 ** 2 /= 123.
>
> --
> Jeff Carter
> "Saving keystrokes is the job of the text editor,
> not the programming language."
> Preben Randhol
> 64
It so so does :) Thanks for that Preben. I hadn't got that far to
discover the godzilla sized error that would of created. Thanks as
well for the help off everyone else.
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: index check failure - constraint error
2011-04-01 12:18 ` Georg Bauhaus
@ 2011-04-01 22:20 ` tonyg
2011-04-01 23:37 ` Ludovic Brenta
0 siblings, 1 reply; 18+ messages in thread
From: tonyg @ 2011-04-01 22:20 UTC (permalink / raw)
On Apr 1, 1:18 pm, Georg Bauhaus <rm.dash-bauh...@futureapps.de>
wrote:
> On 01.04.11 13:27, Alex Mentis wrote:
>
> > Any particular reason you aren't using the Ada-provided Get procedure
> > that converts a String to an Integer?
>
> I'll guess that it is has to do with the good idea to
> do the exercises from chapter 1 of K&R.
Whats K$R? sounds like I need it :)
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: index check failure - constraint error
2011-04-01 22:16 ` tonyg
@ 2011-04-01 22:31 ` Jeffrey Carter
2011-04-01 22:49 ` Robert A Duff
0 siblings, 1 reply; 18+ messages in thread
From: Jeffrey Carter @ 2011-04-01 22:31 UTC (permalink / raw)
On 04/01/2011 03:16 PM, tonyg wrote:
>
> It so so does :) Thanks for that Preben. I hadn't got that far to
> discover the godzilla sized error that would of created. Thanks as
> well for the help off everyone else.
Preben Randhol is the person I'm quoting in my signature, not me.
The idea that Strings always have a lower bound of 1 is quite common among
beginners. I recall noticing it causing others problems when I first learned Ada
in 1984. For some reason I never made that assumption.
In SPARK all Strings do have a lower bound of 1.
--
Jeff Carter
"Saving keystrokes is the job of the text editor,
not the programming language."
Preben Randhol
64
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: index check failure - constraint error
2011-04-01 22:31 ` Jeffrey Carter
@ 2011-04-01 22:49 ` Robert A Duff
2011-04-01 23:00 ` Adam Beneschan
0 siblings, 1 reply; 18+ messages in thread
From: Robert A Duff @ 2011-04-01 22:49 UTC (permalink / raw)
Jeffrey Carter <spam.jrcarter.not@spam.not.acm.org> writes:
> The idea that Strings always have a lower bound of 1 is quite common
> among beginners.
Whereas experts understand that it OUGHT to be true that
"Strings always have a lower bound of 1", but it isn't true.
It's a design flaw in the Ada language.
> In SPARK all Strings do have a lower bound of 1.
As they should. It really makes things simpler.
And (could be) more efficient.
- Bob
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: index check failure - constraint error
2011-04-01 22:49 ` Robert A Duff
@ 2011-04-01 23:00 ` Adam Beneschan
2011-04-01 23:29 ` Robert A Duff
0 siblings, 1 reply; 18+ messages in thread
From: Adam Beneschan @ 2011-04-01 23:00 UTC (permalink / raw)
On Apr 1, 3:49 pm, Robert A Duff <bobd...@shell01.TheWorld.com> wrote:
> Jeffrey Carter <spam.jrcarter....@spam.not.acm.org> writes:
> > The idea that Strings always have a lower bound of 1 is quite common
> > among beginners.
>
> Whereas experts understand that it OUGHT to be true that
> "Strings always have a lower bound of 1", but it isn't true.
> It's a design flaw in the Ada language.
>
> > In SPARK all Strings do have a lower bound of 1.
>
> As they should. It really makes things simpler.
> And (could be) more efficient.
I dunno. I kind of like it that if I'm parsing a string, and I call
Next_Item := Ada.Strings.Fixed.Index_Non_Blank (S
(Current_Index .. S'Last));
then Next_Item is the index of the actual character in S that I need,
and I don't need to add Current_Index to it and then think about
whether I need to add 1 or subtract 1 from the sum, as I'd have to do
something like that if Index_Non_Blank saw its Source parameter as a
string with a lower bound of 1.
-- Adam
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: index check failure - constraint error
2011-04-01 23:00 ` Adam Beneschan
@ 2011-04-01 23:29 ` Robert A Duff
0 siblings, 0 replies; 18+ messages in thread
From: Robert A Duff @ 2011-04-01 23:29 UTC (permalink / raw)
Adam Beneschan <adam@irvine.com> writes:
> On Apr 1, 3:49�pm, Robert A Duff <bobd...@shell01.TheWorld.com> wrote:
>> Jeffrey Carter <spam.jrcarter....@spam.not.acm.org> writes:
>> > The idea that Strings always have a lower bound of 1 is quite common
>> > among beginners.
>>
>> Whereas experts understand that it OUGHT to be true that
>> "Strings always have a lower bound of 1", but it isn't true.
>> It's a design flaw in the Ada language.
>>
>> > In SPARK all Strings do have a lower bound of 1.
>>
>> As they should. �It really makes things simpler.
>> And (could be) more efficient.
>
> I dunno. I kind of like it that if I'm parsing a string, and I call
>
> Next_Item := Ada.Strings.Fixed.Index_Non_Blank (S
> (Current_Index .. S'Last));
>
> then Next_Item is the index of the actual character in S that I need,
> and I don't need to add Current_Index to it and then think about
> whether I need to add 1 or subtract 1 from the sum, as I'd have to do
> something like that if Index_Non_Blank saw its Source parameter as a
> string with a lower bound of 1.
Good point. But I think that's what cursors are for.
I still think indices into Strings ought to be 1-based.
- Bob
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: index check failure - constraint error
2011-04-01 22:20 ` tonyg
@ 2011-04-01 23:37 ` Ludovic Brenta
0 siblings, 0 replies; 18+ messages in thread
From: Ludovic Brenta @ 2011-04-01 23:37 UTC (permalink / raw)
tonyg writes on comp.lang.ada:
> On Apr 1, 1:18 pm, Georg Bauhaus <rm.dash-bauh...@futureapps.de>
> wrote:
>> On 01.04.11 13:27, Alex Mentis wrote:
>>
>> > Any particular reason you aren't using the Ada-provided Get procedure
>> > that converts a String to an Integer?
>>
>> I'll guess that it is has to do with the good idea to
>> do the exercises from chapter 1 of K&R.
>
> Whats K$R? sounds like I need it :)
No you don't :)
Brian Kernighan and Dennis Ritchie were the authors of "The C
Programming Language"...
--
Ludovic Brenta.
^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2011-04-01 23:37 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-04-01 10:53 index check failure - constraint error tonyg
2011-04-01 11:07 ` tonyg
2011-04-01 11:27 ` Alex Mentis
2011-04-01 11:33 ` Alex Mentis
2011-04-01 11:36 ` Alex Mentis
2011-04-01 12:18 ` Georg Bauhaus
2011-04-01 22:20 ` tonyg
2011-04-01 23:37 ` Ludovic Brenta
2011-04-01 11:12 ` Egil Høvik
2011-04-01 11:17 ` tonyg
2011-04-01 12:13 ` Ludovic Brenta
2011-04-01 15:02 ` Adam Beneschan
2011-04-01 17:39 ` Jeffrey Carter
2011-04-01 22:16 ` tonyg
2011-04-01 22:31 ` Jeffrey Carter
2011-04-01 22:49 ` Robert A Duff
2011-04-01 23:00 ` Adam Beneschan
2011-04-01 23:29 ` Robert A Duff
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox