将数组拼接改为Ada 2022归约表达式时触发Range check failed错误,求排查
问题原因
你遇到的range check failed错误,根源在于归约表达式的初始值[]类型推断错误。编译器默认将[]推断为与迭代元素相同的类型(即Bytes_4,固定长度4的Bytes子类型),但Bytes_4要求必须包含4个元素,空数组[]完全不符合这个约束,后续拼接时就会触发范围检查异常。
解决方案
明确指定归约的初始值为Bytes类型的空数组,而非依赖编译器自动推断。将函数B中的初始值[]替换为Bytes'Empty即可:
function B (W : Words) return Bytes is ([for X of W => Convert(X)]'Reduce ("&", Bytes'Empty));
验证说明
Bytes'Empty是Bytes类型的合法空数组,其下标范围为1..0(符合Positive下标类型的空数组规则)。- 归约过程中,每次将当前的
Bytes结果与Bytes_4(Convert(X)的返回值)拼接,最终生成的数组长度正确(3*4=12个元素),完全符合Bytes的动态数组约束。
修改后重新编译运行,就能得到和函数A一致的结果,不会再触发范围检查错误。
内容的提问来源于stack exchange,提问作者user1091344
相关产品推荐
相关产品推荐

