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

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;

关键改动说明

  1. 删除了自定义的String类型,直接使用Ada标准的不定长String类型,Ada.Command_Line.Argument方法返回的就是标准String类型,可以直接赋值使用不需要固定长度。
  2. 增加了参数读取逻辑:用Integer'Value把第一个命令行参数转换为整数作为重复次数,直接把第二个参数赋值给Content变量作为要重复的文本。
  3. 调整循环逻辑为按Repeat_Count的次数循环输出Content,循环内不换行保证文本拼接在一起。
  4. 结尾输出时调用Command_Name获取当前程序的名称,符合预期输出格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:24:00