Ada获取字符输入并检查它是否是有效输入

时间:2014-10-25 19:33:31

标签: character ada

with Ada.Text_IO, Ada.Integer_Text_IO, Ada.Characters.Handling;
with Ada.Exceptions; use Ada.Exceptions;
USE Ada, Ada.Text_Io;

WITH connectfour;
PROCEDURE Main IS
   PACKAGE board is new connectfour;
   USE board;
   col : Character;

   function checkInput (input : Character) RETURN BOOLEAN is
      ins : Character := input;
   begin
      ins := Ada.Characters.Handling.To_Lower(ins);
      if ins = 'a' or ins = 'b' or ins = 'c' or ins = 'd' or
         ins = 'e' or ins = 'f' or ins = 'g' or ins = 'h' then
         return true;
      end if;
      return false;
    end checkInput;

begin
    board.initialize;
    board.print;

    while (not board.isFull) loop
        loop
            PUT("Player"&Integer'Image(board.turn)&": ");
            Ada.Text_IO.Get(col);
            exit when checkInput(col);
        end loop;

        exit when col = '0';
        Text_IO.New_Line;
        Text_IO.Put ("");
        board.play(col);
    end loop;
end Main;

所以当我运行我的程序时,我得到:

玩家1:a - > (我输入了字符' a'然后点击输入)

然后我继续在#34; Ada.Text_IO.Get(col);"""

后面的行中收到此错误

引发了ADA.IO_EXCEPTIONS.DATA_ERROR:a-tiinio.adb:86实例化为a-inteio.ads:18

我想要做的是从用户那里获取单个字符输入并检查它是否在A .. H范围内,如果是,则退出循环,否则继续询问......

我无法找出我的问题...

我允许用户输入小写或大写字符,并将大写字母转换为小写并执行检查。

请帮忙......

我不确定如何阅读单个角色......

1 个答案:

答案 0 :(得分:1)

好的,异常消息可能更清晰(有一些方法可以在一个发生时获得堆栈跟踪,但让我们使用我们得到的...)

locate a-tiinio.adb
/usr/lib/gcc/x86_64-linux-gnu/4.9/rts-native/adainclude/a-tiinio.adb

package body Ada.Text_IO.Integer_IO

和第86行是

中提出的例外
procedure Get
     (Item  : out Num;
      Width : Field := 0)

详情无关紧要但我看不到对Ada.Text_IO.Integer_IO.Get的任何调用。

所以我怀疑所显示的代码是否有效 (以及可以预期的:注意,无论如何都没有办法在{h}之外的exit when col = '0';进入col并且还有另一个调用Get(这次是Integer_IO.Get)的调用board.play。在调用board.play之前打印col =很容易测试。

次要风格评论:

   function checkInput (input : Character) RETURN BOOLEAN is
      ins : Character := input;
   begin
      ins := Ada.Characters.Handling.To_Lower(ins);

可以简化

   function checkInput (input : Character) RETURN BOOLEAN is
      ins : Character := Ada.Characters.Handling.To_Lower(input);
   begin