如何修正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
相关产品推荐
相关产品推荐

