我有一句台词:
const
MY_SET: set of WideChar = [WideChar('A')..WideChar('Z')];上面没有编译,但有错误:
错误集最多可能有256个元素。
但是,这一行确实编译了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规则吗?
发布于 2016-06-21 08:21:03
一个有效的集合必须遵守两个规则:
MY_SET: WideChar =WideChar(‘A’)..WideChar(‘Z’)的集合;
这里您声明了一个集类型 (Set of WideChar),它有超过256个元素的->编译器错误。
如果WS1 in WideChar('A')..WideChar('Z')
在这里,编译器将WideChar('A')看作序数值。此值和集合中的所有其他值都低于256。这符合第一条规则。
唯一元素的数量也在限制范围内(Ord('Z')-Ord('A')+1),因此第二个规则通过了。
MY_SET = WideChar('A')..WideChar('Z'),WideChar('a')..WideChar('z');
在这里,您声明了一个集,它也满足了上面的要求。注意,编译器认为这是一组序数值,而不是set of WideChar。
发布于 2016-06-21 06:34:59
一个集合不能有超过256个元素。
即使只有这么少的元素,set也已经使用了32个字节。
从文件中:
集合是一个位数组,其中每个位指示一个元素是否在集合中。集合中的最大元素数为256个,因此集合所占的字节永远不会超过32个字节。由特定集合占用的字节数等于
(Max div 8) - (Min div 8) + 1
因此,只有一组字节、(Ansi)字符、布尔值和枚举(小于257个元素)是可能的。
因为widechar使用两个字节,所以它可以有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
https://stackoverflow.com/questions/37936271
复制相似问题