Ada命令行参数处理程序编写报错及功能实现问题求解
问题核心原因
- 你自定义了
String类型,覆盖了Ada标准库自带的不定长String类型,自定义的无边界数组类型无法直接被Put方法识别输出,也完全没有必要定义。 - 你没有从命令行参数中读取对应的值赋值给变量:重复次数需要从第一个参数转换得到,要重复的文本需要从第二个参数读取,你声明的
Text变量始终是未初始化状态。 - 循环逻辑完全不符合需求:你循环的上限是参数数量(值为2),而非第一个参数指定的重复次数,也没有拼接输出文本的逻辑。
- 结尾输出程序名时没有调用
Ada.Command_Line提供的Command_Name方法获取程序名,导致输出内容为空。
修正后可正常运行的完整代码
with Ada.Text_IO; use Ada.Text_IO; with Ada.Integer_Text_IO; use Ada.Integer_Text_IO; with Ada.Command_Line; use Ada.Command_Line; procedure my_program is Repeat_Count : Integer; Content : String; begin if Argument_Count = 0 then Put_Line("No arguments given."); elsif Argument_Count /= 2 then Put_Line("Wrong number of arguments given."); else -- 读取第一个参数为重复次数,第二个为要输出的文本 Repeat_Count := Integer'Value(Argument(1)); Content := Argument(2); Put("Message: "); for I in 1 .. Repeat_Count loop Put(Content); end loop; New_Line; Put("The program """); Put(Command_Name); Put(""" is ending."); New_Line; end if; end my_program;
关键改动说明
- 删除了自定义的
String类型,直接使用Ada标准的不定长String类型,Ada.Command_Line.Argument方法返回的就是标准String类型,可以直接赋值使用不需要固定长度。 - 增加了参数读取逻辑:用
Integer'Value把第一个命令行参数转换为整数作为重复次数,直接把第二个参数赋值给Content变量作为要重复的文本。 - 调整循环逻辑为按
Repeat_Count的次数循环输出Content,循环内不换行保证文本拼接在一起。 - 结尾输出时调用
Command_Name获取当前程序的名称,符合预期输出格式。
内容的提问来源于stack exchange,提问作者leun
相关产品推荐
相关产品推荐

