WideChar集合:集合最多可包含256个元素

时间:2016-06-21 05:31:06

标签: delphi delphi-7

我有这一行:

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

上面没有编译,错误:

  

[错误]集合最多可包含256个元素

但是这行确实编译好了:

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

这也编译好了:

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规则吗?

2 个答案:

答案 0 :(得分:11)

有效集必须遵守两条规则:

  1. 集合中的每个元素必须具有小于256的序数值。
  2. 该集合的元素不得超过256个。
  3. 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 :(得分:2)

一个集合的元素不能超过256个 即使元素如此之少,该集合也已经使用了32个字节。

来自文档:

  

一个集合是一个位数组,其中每个位指示一个元素是否在该集合中。集合中的最大元素数为256,因此集合永远不会占用超过32个字节。特定集占用的字节数等于

     

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

因此,只能使用少于257个元素的字节,(ansi)char,boolean和枚举。
因为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