ada - 你如何检查安全类型转换?
问题描述
前言:我正在使用 GNAT 社区的 SPARK Ada 的最新版本(截至撰写时)进行编程。
我一直在互联网上寻找一个简单的解决方案,但所有结果似乎都指向对我不起作用的相同答案。我有一个新类型Digit
定义为TYPE Digit IS new Integer range 0 .. 9
. 我想安全地转换Integer
为Digit
. 为了进行这种转换,我还创建了一个DigitRange
定义为TYPE DigitRange IS range 0 .. 9
. 我试图通过检查是否Digit
在范围 ( IF InputInteger IN DigitRange
) 内来执行此转换,但这会引发不兼容的类型编译错误。
- 是否可以在不明确说明的情况下引用
0 .. 9
定义类型的范围?因为没有子类型,不会产生有用的结果,并且 if 语句将无效。我想通过检查与任意变量(例如.Digit
IF InputInteger IN Digit
IN
DigitRange
- 是否可以在不进行子类型化的情况下执行这种类型转换,同时保持安全并且不接收范围检查可能会失败
gnatprove
? - 或者,我是否应该最初不执行检查,转换类型,然后
Output'Valid
作为最后的手段执行?据我了解,这仍然会给我一个范围检查,类型转换本身可能会失败。
我知道实现这一目标的更理想的解决方案是使用子类型,但我不允许这样做。
谢谢您的回答。
解决方案
将 Integer'Pos 应用于 Integer 值会将其“转换”为“通用整数”,然后您可以测试它是否包含在任何整数类型的范围内:
X : Integer;
...
if Integer'Pos(X) in Digit then ...
推荐阅读
- javascript - Vue JS在iframe中隐藏src值
- apache-nifi - 如何使自定义处理器遵循故障关系
- python - 使用元素列表查询 dynamoDB
- amazon-web-services - EC2 - 创建一个可以访问同一目录的新用户
- python - 在不使用 win32com 库的情况下从 excel 表格生成屏幕截图
- sql - 由于创建了大量分区,SQL 处理器耗尽了内部资源
- css - 第一行大小有限,可变剩余行等于剩余空间的部分?
- abap - 对为 4 个内部连接的外部表创建的内部表使用字段符号
- javascript - 仅当过滤器设置为时才在 url 中设置“参数过滤器”
- java - 按键预览与按下的按键重叠