Dan*_*llo 4 arrays delphi enums
当我声明这样的枚举时:
TConfigBaudRate = (br9600 = 6, br19200 = 8);
Run Code Online (Sandbox Code Playgroud)
并尝试将此枚举与数组一起使用,如下所示:
const
CBaudRates: array [TConfigBaudRate] of string = ('9600', '19200');
Run Code Online (Sandbox Code Playgroud)
Delphi返回以下错误:
E2072元素数量(2)与声明(3)不同
但是,如果我声明TConfigBaudRate没有值或它的第一个项的值.
似乎Delphi创建了一个7号元素.这是Delphi的正常特性吗?我找不到任何参考.
Ken*_*ite 11
这是记录在案的行为.
从简单类型 - 具有明确分配的普通性的枚举类型 :( 强调我的)
默认情况下,枚举值的序数从0开始,并遵循其标识符在类型声明中列出的顺序.您可以通过为声明中的部分或全部值明确指定顺序来覆盖它.要为值指定一个常量,请使用= constantExpression跟随其标识符,其中constantExpression是一个求值为整数的常量表达式.例如:
Run Code Online (Sandbox Code Playgroud)type Size = (Small = 5, Medium = 10, Large = Small + Medium);定义一个名为Size的类型,其可能的值包括Small,Medium和Large,其中Ord(Small)返回5,Ord(Medium)返回10,Ord(Large)返回15.
枚举类型实际上是一个子范围,其最低值和最高值对应于声明中常量的最低和最高序数.在前面的示例中,Size类型有11个可能的值,其序数范围从5到15.(因此Char的类型数组[Size]表示一个包含11个字符的数组.)这些值中只有三个具有名称,但其他值是可以通过类型转换和例如Pred,Succ,Inc和Dec等例程访问.在下面的示例中,Size的范围内的"anonymous"值被赋给变量X.
Run Code Online (Sandbox Code Playgroud)var X: Size; X := Small; // Ord(X) = 5 X := Size(6); // Ord(X) = 6 Inc(X); // Ord(X) = 7
所以,对于你的例子,即使你只使用了两个值(6和8),7也是一个包含的值,即使它没有被命名,因为它属于指定的顺序,就像所描述的array[Size] of Char那样.表示一个包含11个字符的数组.
问题是您的枚举类型指定了序数值,并且您使用明确指定的常规错过了一些值.
文档的关键引用是:
枚举类型实际上是一个子范围,其最低值和最高值对应于声明中常量的最低和最高序数.
该方案显示,ord(low(TConfigBaudRate))是6和ord(high(TConfigBaudRate))是8.
{$APPTYPE CONSOLE}
type
TConfigBaudRate = (br9600 = 6, br19200 = 8);
begin
Writeln(ord(low(TConfigBaudRate)));
Writeln(ord(high(TConfigBaudRate)));
end.
Run Code Online (Sandbox Code Playgroud)
产量
6 8
这意味着您的数组包含三个序号为6,7和8的项.您只在常量中指定了两个值,这就是编译器错误告诉您的内容.
您可以通过提供三个值来解决编译器错误,如下所示:
const
CBaudRates: array [TConfigBaudRate] of string = ('9600', '', '19200');
Run Code Online (Sandbox Code Playgroud)
但是,我认为整个体验是语言告诉你停止使用明确指定的标准的方式.