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
相关产品推荐
相关产品推荐

