You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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操作包,完美适配类型需求:

  1. 在声明部分添加自定义类型的IO包:
package Number_Range_IO is new Ada.Text_IO.Integer_IO(Number_Range);
use Number_Range_IO;
  1. 将原代码中的Ada.Integer_Text_IO.Get(Guess);替换为:
Number_Range_IO.Get(Guess);

方案2:临时转换类型(带范围校验)

如果不想新增IO包,可以先将输入读取到标准Integer变量,再转换为Number_Range类型,同时添加异常处理避免输入超出范围:

  1. 在变量声明部分新增临时变量:
Temp_Guess : Integer;
  1. 修改循环内的输入逻辑:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 14:16:01