Добрый день,
Недавно копался в простейшей вещи: работа с множествами.
Обнаружил весьма странное поведение, хотя и вполне понятное из физического представления множеств, но недокументированное в хелпе.
program prg;
type
range=10..255;
rangedset=set of range;
var
s: rangedset;
begin
s:=[0..12];
if 0 in s then
WriteLn('0 in set');
if 9 in s then
WriteLn('9 in set');
end;
Как вы думаете, что выведет такая программа, и какие элементы содержатся в множестве?
Правильный ответ

:
программа выведет
9 in set
В множестве содержатся эл-ты 8,9,10,11,12.
Причем результат воспроизводится с {$OVERFLOWCHECKS ON}{$RANGECHECKS ON}
и с отладочной версией RTL.
С уважением, Евгений Белоусов.
PS Хотя все множества заданы константами, компилятор не выдает ни даже хинтов
по этому поводу.
... << RSDN@Home 1.1 beta 1 >>
> вполне понятное из физического представления множеств
Не догоняю, можно здесь поподробнее, почему понятное?
Posted via RSDN NNTP Server 1.6
IMHO. смайлики добавить по вкусу.
Здравствуйте, S-SH, Вы писали:
>> вполне понятное из физического представления множеств
SS>Не догоняю, можно здесь поподробнее, почему понятное?
Множество представляется в delphi как массив длиной от 1 до 32 байтов, в зависимости от типа, на котором оно конструируется.
Например sizeof(set of byte)=32, sizeof(set of 1..2)=1.
Понятно, что чем больше значений в базовом типе, тем больше байтов занимает множество.
Вычисляется размер множества следующим образом:
(maxval div 8) - (minval div 8) + 1
При этом, так как компилятор размещает множество в целом кол-ве байтов,
то множеством set of minval..maxval можно физически представить значения от
(minval div 8)*8 до ((maxval div 8)+1)*8-1
То есть в вышеприведенном примере мы получаем, что для rangedset создается
массив из 31 байта, который физически может содержать эл-ты от 8 до 255.
И любой из этих эл-тов можно добавить в множество, даже неверные с точки зрения логики 8 и 9.
С уважением, Евгений Белоусов.
... << RSDN@Home 1.1 beta 1 >>
> При этом, так как компилятор размещает множество в целом кол-ве байтов,
> то множеством set of minval..maxval можно физически представить значения от
> (minval div 8)*8 до ((maxval div 8)+1)*8-1
Вот теперь понятно
Posted via RSDN NNTP Server 1.6
IMHO. смайлики добавить по вкусу.