2016-06-21 30 views
7

我有这样一行:集WideChar的:设置最多可以有256个元素

const 
    MY_SET: set of WideChar = [WideChar('A')..WideChar('Z')]; 

以上无法编译,错误:

[Error] Sets may have at most 256 elements

,但此行不会编译OK:

var WS: WideString; 
if WS[1] in [WideChar('A')..WideChar('Z')] then... 

,这也编译OK:

const 
    MY_SET = [WideChar('A')..WideChar('Z'), WideChar('a')..WideChar('z')]; 
    ... 
    if WS[1] in MY_SET then... 

这是为什么?

编辑:我的问题是,为什么if WS[1] in [WideChar('A')..WideChar('Z')]编译?为什么MY_SET = [WideChar('A')..WideChar('Z'), WideChar('a')..WideChar('z')];编译?他们是不是也需要适用于set规则?

+0

第二个代码只有26个元素。使用> =和<=在这里更简单。请注意,您的代码不会承认非英文字符。 –

+0

@大卫,第一个代码不是也有26个元素? “请注意你的代码不承认非英文字符。”我需要检查有效的ISO字符。只有英文字符才有效。 – zig

+1

只要元素本身低于256第二个表达式是有效的。第一个表达式声明一个大于256的集合(WideChar集合)。 –

回答

11

一组有效的必须遵守两个规则:

  1. 集中的每个元素都必须有一个顺序值小于256。
  2. 该集合不得超过256个元素。
MY_SET: set of WideChar = [WideChar('A')..WideChar('Z')]; 

在这里,你定义一个集类型Set of WideChar),其具有256种以上的元素 - >编译错误。

if WS[1] in [WideChar('A')..WideChar('Z')] 

在这里,编译器将WideChar('A')看作序数值。这个值和该集合中的所有其他值都低于256.这与规则1一致。

唯一元素的数量也在限制内(Ord('Z') - Ord('A')+ 1) ,所以第二条规则通过。

MY_SET = [WideChar('A')..WideChar('Z'), WideChar('a')..WideChar('z')]; 

在此声明一组也满足上述要求。请注意,编译器将此视为一组序号值,而不是set of WideChar

+1

有趣的是,在第二种情况下(如果WS [1]在,,,)它是如何做比较的? –

+0

@TomBrunberg,除了编译器在比较中使用左参数的大小和字节大小set元素之外没有任何区别。 –

+1

@zig所以错误发生在* MY_SET:WideChar *部分,而不是* [WideChar('A').. WideChar('Z')] * –

2

一组不能超过256个元素。
即使有这么少的元素,集合已经使用了32个字节。

从文档:

A set is a bit array where each bit indicates whether an element is in the set or not. The maximum number of elements in a set is 256, so a set never occupies more than 32 bytes. The number of bytes occupied by a particular set is equal to

(Max div 8) - (Min div 8) + 1

为此仅套字节的,(ANSI)炭,布尔和少于257个元素枚举是可能的。
因为widechar使用2个字节,它可以有65536个可能的值。
一组widechar将占用8Kb,太大而不实用。

type 
    Capitals = 'A'..'Z'; 

const 
    MY_SET: set of Capitals = [WideChar('A')..WideChar('Z')]; 

将编译和工作相同。

如果您的代码忽略unicode,使用widechar似乎有点愚蠢。
由于只有英文首都被认可,所以您不会考虑到不同的地区。

在这种情况下,它会更好地使用如下代码

if (AWideChar >= 'A') and (AWideChar <= 'Z') .... 

,将工作,无论有多少个字符之间如何里钻
显然你可以将它封装在一个函数中以节省输入。

如果你坚持有大集,看到这样的回答:https://stackoverflow.com/a/2281327/650492

+2

但是,如果[WideChar('A').. WideChar('Z')]'中的WS [1]编译?为什么'MY_SET = [WideChar('A').. WideChar('Z'),WideChar('a').. WideChar('z')];'编译?他们是不是也适用于'set'规则?有什么不同? – zig

+4

编译器将WideChar('A')'转换为小于256的序数值。如果您输入的值大于该值,编译器将会报错。现在,编译器具有Ord('Z') - Ord('A')+1元素的有效集合。 –

相关问题