0

https://github.com/AdaCoreU/Courses/blob/master/lectures/03_Programming_in_the_Large/02_Type_Safety/slides/Strong_Typing.ppt?raw=trueのスライド 28 によると 、「T は Integer のサブタイプであるため、以下のコードは正しいです。 。したがって、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

スライドが間違っていますか、それとも何か誤解していますか?

4

1 に答える 1

3

Ada はタイプとサブタイプを区別します。型は値の個別のスペースです。サブタイプは、特定のタイプの互換性のあるサブセットです。

T一般に、型の異なるサブタイプ (技術的にはとの両方がサブタイプ) 間の変換をコンパイル時にチェックすることはできないため、Integerそのような変換はすべてコンパイル時に有効であると見なされますが、もちろん実行時に失敗する可能性があります。 -time、実際の値がターゲット サブタイプに適合しない場合。

そうです、タイプとサブタイプの違いを見落としている可能性があります。

于 2015-05-01T06:53:44.513 に答える