是否使用其范围受限的子类型在Ada中被认为是正确的类型?

时间:2015-04-30 06:13:06

标签: range ada subtype subtyping

根据幻灯片28 https://github.com/AdaCoreU/Courses/blob/master/lectures/03_Programming_in_the_Large/02_Type_Safety/slides/Strong_Typing.ppt?raw=true 以下代码是正确的,因为 “T是整数的子类型。因此,V1和V2属于同一类型”

procedure weirdada is
  subtype T is Integer range 1 .. Integer'Last;
  V1 : Integer := 0;
  V2 : T := V1;
begin
  null;
end;

但如果我被允许违反它,范围声明的目的是什么? 我的想法似乎是正确的,因为在编译时有一个警告, 和运行时的异常。

$ ./gnat-gpl-2014-x86-linux-bin/bin/gnatmake weirdada.adb
gcc -c weirdada.adb
weirdada.adb:4:19: warning: value not in range of type "T" defined at line 2
weirdada.adb:4:19: warning: "Constraint_Error" will be raised at run time
gnatbind -x weirdada.ali
gnatlink weirdada.ali

$ ./weirdada
raised CONSTRAINT_ERROR : weirdada.adb:4 range check failed

幻灯片不正确,还是我误解了什么?

1 个答案:

答案 0 :(得分:3)

Ada区分类型和子类型。类型是值的单独空格。子类型是给定类型的兼容子集。

由于通常不可能对类型的不同子类型之间的转换进行编译时检查(技术上TInteger都是子类型),所有这些转换都是在编译时被视为合法,但如果实际值不适合目标子类型,则当然可能在运行时失败。

所以是的,你可能错过了类型和子类型之间的区别。