Ada整数猜数字游戏Line25报错:无匹配候选解释如何修复?
Ada猜数字游戏编译错误修复方案
错误原因分析
报错的第25行Ada.Integer_Text_IO.Get(Guess);存在类型不匹配问题:Ada.Integer_Text_IO的Get子程序仅支持标准Integer类型,但你定义的Guess是自定义离散类型Number_Range,编译器找不到匹配的子程序实现,因此抛出no candidate interpretations match the actuals错误。
修复方案
这里提供两种可行的修复方式:
方案1:为自定义类型生成专属IO包
Ada允许为自定义整数范围类型生成对应的IO操作包,完美适配类型需求:
- 在声明部分添加自定义类型的IO包:
package Number_Range_IO is new Ada.Text_IO.Integer_IO(Number_Range); use Number_Range_IO;
- 将原代码中的
Ada.Integer_Text_IO.Get(Guess);替换为:
Number_Range_IO.Get(Guess);
方案2:临时转换类型(带范围校验)
如果不想新增IO包,可以先将输入读取到标准Integer变量,再转换为Number_Range类型,同时添加异常处理避免输入超出范围:
- 在变量声明部分新增临时变量:
Temp_Guess : Integer;
- 修改循环内的输入逻辑:
Ada.Text_IO.Put("guess NOW:"); begin Ada.Integer_Text_IO.Get(Temp_Guess); Guess := Number_Range(Temp_Guess); exception when Constraint_Error => Ada.Text_IO.Put_Line("请输入1到100之间的有效数字!"); Ada.Text_IO.Skip_Line; -- 跳过错误输入行,避免死循环 continue; -- 直接进入下一轮循环 end;
完整修复代码(方案1)
with Ada.Text_IO; with Ada.Integer_Text_IO; with Ada.Numerics.Discrete_Random; procedure Guessing_Game is type Number_Range is range 1 .. 100; package Random_Number is new Ada.Numerics.Discrete_Random(Number_Range); use Random_Number; -- 为自定义类型创建专属IO包 package Number_Range_IO is new Ada.Text_IO.Integer_IO(Number_Range); use Number_Range_IO; Generator : Random_Number.Generator; Secret_Number : Number_Range; Guess : Number_Range; Attempts : Integer := 0; Last_Guess : Integer := -1; begin Reset(Generator); Secret_Number := Random(Generator); Ada.Text_IO.Put_Line("1 to 100, if not guessed then byebye system32!"); loop Ada.Text_IO.Put("guess NOW:"); Number_Range_IO.Get(Guess); if Integer(Guess) = Last_Guess then Ada.Text_IO.Put_Line("Try one more before the os is deleted!"); else Attempts := Attempts + 1; Last_Guess := Integer(Guess); if Guess < Secret_Number then Ada.Text_IO.Put_Line("eeeee too smol"); elsif Guess > Secret_Number then Ada.Text_IO.Put_Line("eeeee too big"); else Ada.Text_IO.Put_Line("Ok you guessed it in "); Ada.Integer_Text_IO.Put(Attempts); Ada.Text_IO.Put_Line(" attempts, os wont be removed anymore"); exit; end if; end if; end loop; end Guessing_Game;
内容的提问来源于stack exchange,提问作者francis245
相关产品推荐
相关产品推荐

