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

如何修正Ada过程参数为in out模式?解决编译模式不匹配错误

修正Ada过程的参数模式与逻辑错误

错误原因分析

你遇到的编译错误核心是过程实现的参数模式与声明不匹配:声明里明确指定Arr为in out模式,但实现时未显式标注参数模式,Ada默认会将未标注的参数视为in模式(只读),这就导致了模式不匹配的编译错误。此外,Reverse_Bin_Arr过程中的索引计算存在越界问题,会引发运行时错误。

修正后的完整代码

首先补充必要的类型定义(你提供的代码中未包含,需提前定义),然后修正过程实现:

类型与过程声明(assgn.ads)

package Assgn is
   type BINARY_NUMBER is range 0 .. 1;
   type BINARY_ARRAY is array (1 .. 16) of BINARY_NUMBER;

   --initialize first array (My_Array) with random binary values
   procedure Init_Array (Arr: in out BINARY_ARRAY);

   --reverse binary array
   procedure Reverse_Bin_Arr (Arr : in out BINARY_ARRAY);
end Assgn;

过程实现(assgn.adb)

with Ada.Numerics.Discrete_Random;

package body Assgn is
   --initialize first array (My_Array) with random binary values
   procedure Init_Array (Arr : in out BINARY_ARRAY) is
      package Random_Bit is new Ada.Numerics.Discrete_Random (BINARY_NUMBER);
      use Random_Bit;
      G : Generator;
   begin
      Reset (G);
      for Index in Arr'Range loop  -- 使用数组属性替代硬编码范围,更通用
         Arr(Index) := Random(G); 
      end loop;
   end Init_Array;

   --reverse binary array
   procedure Reverse_Bin_Arr (Arr : in out BINARY_ARRAY) is
      Hold : BINARY_ARRAY := Arr;
   begin
      -- 修正索引计算:原15-Index会导致Index=16时出现负数索引,越界
      for Index in Arr'Range loop
         Arr(Arr'Last - Index + Arr'First) := Hold(Index);
      end loop;
   end Reverse_Bin_Arr;
end Assgn;

测试主程序(可选)

with Assgn; use Assgn;
with Ada.Text_IO; use Ada.Text_IO;

procedure Test_Assgn is
   My_Arr : BINARY_ARRAY;
begin
   -- 初始化数组
   Init_Array(My_Arr);
   Put_Line("初始化后的数组:");
   for Bit of My_Arr loop
      Put(BINARY_NUMBER'Image(Bit) & " ");
   end loop;
   New_Line;

   -- 反转数组
   Reverse_Bin_Arr(My_Arr);
   Put_Line("反转后的数组:");
   for Bit of My_Arr loop
      Put(BINARY_NUMBER'Image(Bit) & " ");
   end loop;
   New_Line;
end Test_Assgn;

关键修正点说明

  • 参数模式匹配:在过程实现中必须显式指定Arr : in out BINARY_ARRAY,确保与声明的模式完全一致,这样才能对参数进行读写操作。
  • 数组范围通用化:使用Arr'Range替代硬编码的1..16,如果后续修改数组范围,代码无需手动调整,提升可维护性。
  • 反转索引修正:原代码15 - Index会导致当Index=16时计算出-1,超出数组下标范围(1..16)。改用Arr'Last - Index + Arr'First的方式,无论数组下标从何开始,都能正确计算反转后的对应位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 16:05:32