comp.lang.ada
 help / color / mirror / Atom feed
From: Richard Iswara <haujekchifan@gmail.com>
Subject: Re: Get_Line skip input
Date: Fri, 27 Aug 2021 09:55:45 +0700	[thread overview]
Message-ID: <sg9k7k$keb$1@gioia.aioe.org> (raw)
In-Reply-To: sg7lom$oj6$1@dont-email.me

On 26/08/2021 16.09, Jeffrey R. Carter wrote:
> On 8/26/21 7:36 AM, Richard Iswara wrote:
>>
>> So on the terminal it shows like this:
>> Keywords number 1 =  Enter Multiplier for keyword <here cursor wait 
>> for entry>
>> Keywords number 2 =  Enter Multiplier for keyword <here cursor wait 
>> for entry>
> 
> I set Kw_Numbers to 3 and added an output loop after the input loop:
> 
>     for I in Key_Words'Range loop
>        Ada.Text_IO.Put_Line (Item => I'Image & ' ' &
>                                      Key_Words (I) (1 .. W_Len (I) ) &
>                                      Multiplier (I)'Image);
>     end loop;
> 
> I am unable to duplicate this behavior:
> 
> ~/Code$ ./kw_test
> Enter keywords less than 10 characters.
> Keywords number 1 = one
> Enter multiplier for keyword 7
> 
> Keywords number 2 = Enter multiplier for keyword 6
> 
> Keywords number 3 = Enter multiplier for keyword 3
> 
>   1 one 7
>   2  6
>   3  3
> 
> As Holsti explained, this behavior is due to Ada.Integer_Text_IO.Get 
> behaving as specified, leaving the rest of the line available to Get_Line:
> 
> ~/Code$ ./kw_test
> Enter keywords less than 10 characters.
> Keywords number 1 = one
> Enter multiplier for keyword 7
> 
> Keywords number 2 = Enter multiplier for keyword 6
> 
> Keywords number 3 = Enter multiplier for keyword 3
> 
>   1 one 7
>   2  6
>   3  3
> ~/Code$ ./kw_test
> Enter keywords less than 10 characters.
> Keywords number 1 = one
> Enter multiplier for keyword 7two
> 
> Keywords number 2 = Enter multiplier for keyword 6three
> 
> Keywords number 3 = Enter multiplier for keyword 3
> 
>   1 one 7
>   2 two 6
>   3 three 3
> 
> In general, I recommend obtaining a complete line and parsing it, rather 
> than inputting values with Get:
> 
> Get_Mult : loop
>     Ada.Text_IO.Put (Item => "Enter multiplier for keyword ");
> 
>     One_Mult : declare
>        Line : constant String := Ada.Text_IO.Get_Line;
>     begin -- One_Mult
>        Multiplier (I) := Integer'Value (Line);
> 
>        exit Get_Mult;
>     exception -- One_Mult
>     when others =>
>        Ada.Text_IO.Put_Line (Item => "Enter an non-negative integer");
>     end One_Mult;
> end loop Get_Mult;
> 
> In general such code has to handle errors in the input. Users will input 
> key words > the specified max and non-numeric multipliers. Error 
> handling is simplified if one obtains complete lines (using the Get_Line 
> function) and deals with them.
> 
> Back in the Good Old Days (TM), I started off using FORTRAN 66 (it was 
> always written FORTRAN because the keypunches only had capital letters), 
> where the only data structure was the array. Things that would be an 
> array of records in a decent language were represented as groups of 
> parallel arrays. That seems to be what you're doing here.
> 
> subtype KW_Name_Length is Integer range 0 .. 10;
> 
> type Key_Word_Info (Length : KW_Name_Length := 0) is record
>     Name : String (1 .. Length);
>     Multiplier : Natural;
> end record;
> 
> Num_KW : constant := 3;
> 
> type KW_List is array (1 .. Num_KW) of Key_Word_Info;
> 
> Key_Word : KW_List;
> 
Thank you Niklas and Jeffrey for the explanation and the better way to 
do an input message.
Regards,
Richard.

      reply	other threads:[~2021-08-27  2:55 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-26  5:36 Get_Line skip input Richard Iswara
2021-08-26  7:56 ` Niklas Holsti
2021-08-26  9:09 ` Jeffrey R. Carter
2021-08-27  2:55   ` Richard Iswara [this message]
replies disabled

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