ada - 在 Ada 中是否可能有不连续的子类型定义?
问题描述
假设我有以下常量来定义一个只接受其范围定义内的有效值的子类型:
type Unsigned_4_T is mod 2**4;
valid_1 : constant Unsigned_4_T := 0;
valid_2 : constant Unsigned_4_T := 1;
invalid_1 : constant Unsigned_4_T := 2;
valid_3 : constant Unsigned_4_T := 3;
现在,我想定义 Unsigned_4_T 的子类型 VALID_VALUES_T,它只接受使用常量 valid_1、valid_2 和 valid_3 的有效值。
我一直在尝试使用 Static_Predicate 来实现这一点,但是,当我声明所需子类型的变量并分配 invalid_1 值时,没有预期的约束或编译错误。
解决方案
AdaCore 编译器要求您启用断言以生成您需要的异常。使用 -gnata 标志编译您的程序。
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Exceptions; use Ada.Exceptions;
with System.Assertions; use System.Assertions;
procedure Main is
type Unsigned is mod 2**4;
subtype discontinuous is Unsigned with
Static_Predicate => discontinuous in 0 | 1 | 3;
Num : discontinuous;
begin
for I in Unsigned'Range loop
Num := I;
Put_Line(Num'Image);
end loop;
exception
when E :Assert_Failure =>
Put_Line("Invalid value assigned to Num: " & Exception_Message(E));
end Main;
程序的输出是:
0 1 分配给 Num 的值无效:Static_Predicate 在 main.adb:12 失败
推荐阅读
- mysql - 如何解决mysql存储过程
- android - 如何立即从范围内取消(返回)Kotlin 协程?
- python - 如何对角分割图像?
- php - 如何在不先用 php 提取内容的情况下显示 Zip 文件的图像内容?
- ios - 使用 KVO 观察视图控制器生命周期,不起作用
- git - 为 AWS CodeCommit 生成 HTTPS Git 凭证:AWS 编程访问
- javascript - javascript 使用参数从内部调用函数表达式本身
- docker - sudoer 文件允许 docker 的命令不起作用
- python - 将(缺少)用户输入更改为默认字符串值
- php - Laravel:将分组数据转换为一行