Ada自定义向量运算符中提升运算中间值的最优实现方案咨询
解决方案
- 最优方案1:局部关闭运算表达式的范围检查
你只需要在触发错误的第24行代码添加Suppress方面规约,即可实现和标量运算完全一致的中间值不检查效果,无需修改运算符定义,也不需要额外转换函数:
把原第24行修改为:
这种方案的优势是安全性最高,仅在你明确知道中间值溢出但最终运算结果落在Byte合法范围内的场景关闭检查,其他代码的范围校验逻辑完全不受影响,也没有任何额外的时空开销。Z := (X + Y) / 2 with Suppress => Range_Check; - 方案2:为自定义运算符关闭范围检查
如果你需要频繁做这类中间值可能溢出的向量运算,可以直接给自定义运算符加上范围检查抑制的方面规约:
修改后原第24行代码不需要做任何改动即可正常运行,和标量运算的行为完全对齐。function "+" (Left, Right : Point) return Point with Suppress => Range_Check is (Left (1) + Right (1), Left (2) + Right(2)); function "/" (Left : Point; Right : Byte) return Point with Suppress => Range_Check is (Left (1) / Right, Left (2) / Right);
注意:两种方案的本质都是对齐Ada对标量中间值的处理逻辑:不对运算链上的中间结果做范围校验,仅对最终赋值给变量的结果做范围检查,只要你保证最终运算结果落在Byte的0~255范围内,就不会出现逻辑错误。
内容的提问来源于stack exchange,提问作者PolarBear2015
相关产品推荐
相关产品推荐

