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

Ada布尔数组编程实现输入功能时for循环报错求助

问题解决思路
  • 第一个错误点:循环范围不符合Ada语法规则
    Ada中Boolean类型的枚举排序为False < True,你使用的True..False是升序范围定义,此时上限小于下限,范围为空,编译器会直接抛出范围非法的错误。如果需要遍历Boolean的两个值,要么调整为升序范围False..True,如果要倒序遍历则需要加reverse关键字,写成for I in reverse Boolean'Range loop或者for I in reverse False..True loop。
  • 第二个错误点:缺少自定义数组的读取实现
    你代码中直接调用Get(MyArray(I)),但Ada标准库没有提供你自定义的Array_Inner_Type类型的Get函数,编译也会报子程序未定义的错误,你需要自行实现对应数组的字符串读取逻辑。
修正后可编译的代码示例
with Ada.Text_IO;         use Ada.Text_IO;
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;

procedure Array is
   
   type Array_Inner_Type is
      array (5..9) of String(1..5);
     
   type Boolean_Type is 
      array (False..True) of Array_Inner_Type;
   
   MyArray : Boolean_Type;

   -- 实现Array_Inner_Type的读取
   procedure Get_Inner(Arr : out Array_Inner_Type) is
   begin
      for Idx in Array_Inner_Type'Range loop
         Arr(Idx) := Get_Line;
         -- 这里可以加输入校验,确保输入长度为5
      end loop;
   end Get_Inner;

   procedure Get(MyArray : out Boolean_Type) is 
   begin
      -- 修正循环范围
      for I in Boolean'Range loop
         Get_Inner(MyArray(I));
      end loop;
   end Get;

   -- 补充实现你要的终端交互逻辑
   procedure Show_Terminal_Effect is
      Input_Str : String(1..59); -- 对应10个5位串加9个空格的总长度
      Last : Integer;
   begin
      Put_Line("For DS2:");
      Put("Type your data: ");
      Get_Line(Input_Str, Last);
      Put_Line("Your data: " & Input_Str(1..Last));
   end Show_Terminal_Effect;
    
begin
   Show_Terminal_Effect;
   -- 如果需要把输入拆分存到MyArray可以在这里加拆分逻辑
end Array;
补充说明

如果你的需求只是实现终端输入回显,不需要用到布尔数组的话,直接读取整行输入再回显即可,不需要定义复杂的数组结构。如果必须要把输入的10个5位字符串存入你定义的Boolean_Type数组中,只需要在读取到整行输入后按空格拆分,依次存入对应数组下标即可。

内容的提问来源于stack exchange,提问作者leun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:36:06