procedure TForm1.Button1Click(Sender: TObject); var iFor, iFor2, xI: integer; begin ListBox1.Hide; ListBox1.Clear; for iFor := 0 to 10000 do for iFor2 := 0 to iFor do begin if iFor2 > 100 then break; if not(iFor2 in [0..iFor]) then ListBox1.Items.Add('Top=' + IntToStr(iFor) + '; In=' + IntToStr(iFor2)); end; ListBox1.Show; end;
initialization {$I unit1.lrs}
end.
Начиная с 256 (верхняя граница вхождения) функция в нерабочем состоянии. Баг или как?
Просто множество представляется компилятором как восьмибайтовое целое. Каждое вхождение - очередной бит. При выполнении in делается простой And с шаблоном. Вот почему больше 256 элементов в множестве быть не может.
in работает со множествами. Ограничение для множеств [0..255]. => Компилятор ограничивает in в диапазоне [0..255]. Хотя, технически, можно было бы и dword и qword использовать.
По русски что-ли не понятно написал? Никакого отношения к размерности целых чисел множества не имеют. Ограничение в 256 элементов связано только с реализацией "алгебры" для множеств. Она реализуется на основе битовой алгебры и восьмибайтовых регистров. Всего 256 бит.
На фазе препроцессинга компилятор отбирает все возможные "наименования" элементов множества и заносит в таблицу "имя"х"код". Каждый код таблицы образуется как восьмибайтовое число с одним установленным битом. Все коды в этой таблице уникальны.
Если значение (слева от in) не входит в таблицу, то оно и не проверяется на совпадение.