为什么这个Ada类型定义导致编译错误?

时间:2014-09-09 13:36:51

标签: types ada

类型B的定义等于类型A的定义,它只是一种较短的形式。它完美无缺。

所以我假设类型D的定义再次等于类型C的定义。然而,它会抛出下面打印的编译器错误。为什么?

程序文本:

type range_T is range 0 .. 255;
type A       is array (range_T)  of Integer;
type B       is array (0 .. 255) of Integer;

type enum_T is (N, S, W, O);
type C      is array (enum_T)     of Integer;
type D      is array (N, S, W, O) of Integer;

编译器控制台输出:

$gnatmake hello.adb 2>&1

gcc -c hello.adb
hello.adb:12:27: invalid subtype mark in discrete range
hello.adb:12:30: invalid subtype mark in discrete range
hello.adb:12:33: invalid subtype mark in discrete range
hello.adb:12:36: invalid subtype mark in discrete range
gnatmake: "hello.adb" compilation error

1 个答案:

答案 0 :(得分:3)

问题是N, S, W, O不是范围。通过syntax rules,它被视为一系列index_subtype_definitions - 它显然不是。

正确的语法(镜像你问题中的第一组定义)是这样的:

type enum_T is (N, S, W, O);
type C      is array (enum_T)     of Integer;
type D      is array (N .. O)     of Integer;