Types 为什么此Ada类型定义会导致编译错误?

Types 为什么此Ada类型定义会导致编译错误?,types,ada,Types,Ada,类型B的定义等同于类型A的定义,它只是一个较短的形式。它工作完美无瑕 因此,我假设类型D的定义再次等于类型C的定义。然而,它抛出了下面打印的编译器错误。为什么 程序文本: 编译器控制台输出: 问题是N、S、W、O不是一个范围。根据,它被视为一系列索引子类型定义——显然不是这样 正确的语法(反映您问题中的第一组定义)如下: 类型D是整数的数组(N,S,W,O)是四维数组的语法——或者至少如果N、S、W和O是类型或子范围(子类型N是整数范围1..5或类似的东西),那么它就是。请注意,您的假设存在一个

类型
B
的定义等同于类型
A
的定义,它只是一个较短的形式。它工作完美无瑕

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

程序文本: 编译器控制台输出:
问题是
N、S、W、O
不是一个范围。根据,它被视为一系列索引子类型定义——显然不是这样

正确的语法(反映您问题中的第一组定义)如下:


类型D是整数的数组(N,S,W,O)
是四维数组的语法——或者至少如果
N
S
W
O
是类型或子范围(
子类型N是整数范围1..5
或类似的东西),那么它就是。请注意,您的假设存在一个问题,即
B
使用
0..255
作为索引子范围,而
range\u T
的定义是
range 0..255
——因此它们在任何情况下都不相同。@ajb:感谢您对四维数组的输入!多维数组是我在本文中没有想到的。您能否进一步阐述一下您对
B
range\u T
的定义?不幸的是,我还不完全清楚。你说过,在任何情况下,这些数据都是不一样的。那么类型
A
B
在哪些方面不同呢?类型
A
B
没有区别。我指的是您所做的假设,即您可以将类型定义的文本复制到数组索引中。但是
range\u T
类型的文本是
range 0。。255,并且B的数组索引中的文本是
0。。255
没有
范围
关键字,因此您不应该假设在第二种情况下可以复制文本。这就是我想说的。A和B的不同是因为它们是在不同的地方制造的(我最初写的“因为它们不同”:。无法将类型B的值分配给类型a的变量。即使类型定义实际上相同,也会出现这种情况。
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
type enum_T is (N, S, W, O);
type C      is array (enum_T)     of Integer;
type D      is array (N .. O)     of Integer;