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范围内,如果是,则退出循环,否则继续询问......
我无法找出我的问题...
我允许用户输入小写或大写字符,并将大写字母转换为小写并执行检查。
请帮忙......
我不确定如何阅读单个角色......
答案 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