Забавное поведение D6 при работе с множествами
От: Евг. Белоусов Россия  
Дата: 09.07.03 10:13
Оценка:
Добрый день,
Недавно копался в простейшей вещи: работа с множествами.
Обнаружил весьма странное поведение, хотя и вполне понятное из физического представления множеств, но недокументированное в хелпе.


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 >>
Re: Забавное поведение D6 при работе с множествами
От: S-SH Россия http://shmakov.ru/
Дата: 09.07.03 11:20
Оценка:
> вполне понятное из физического представления множеств

Не догоняю, можно здесь поподробнее, почему понятное?
Posted via RSDN NNTP Server 1.6
IMHO. смайлики добавить по вкусу.
Re[2]: Забавное поведение D6 при работе с множествами
От: Евг. Белоусов Россия  
Дата: 09.07.03 11:48
Оценка: 11 (1)
Здравствуйте, 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 >>
Re[3]: Забавное поведение D6 при работе с множествами
От: S-SH Россия http://shmakov.ru/
Дата: 10.07.03 07:00
Оценка:
> При этом, так как компилятор размещает множество в целом кол-ве байтов,
> то множеством set of minval..maxval можно физически представить значения от
> (minval div 8)*8 до ((maxval div 8)+1)*8-1

Вот теперь понятно
Posted via RSDN NNTP Server 1.6
IMHO. смайлики добавить по вкусу.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.