const csRusSmallI = AnsiChar('и'); csRusBigI = AnsiChar('И'); csSetRusI = [csRusSmallI, csRusBigI]; begin Assert(#0 in csSetRusI); //- проверка проходит, что НЕ правильно end.
const csRusSmallI = AnsiChar('и'); csRusBigI = AnsiChar('И'); csSetRusI : set of AnsiChar = [csRusSmallI, csRusBigI]; begin Assert(#0 in csSetRusI); //- проверка НЕ проходит, что ПРАВИЛЬНО end.
Delphi XE4
"Понятное дело", что есть CharInSet и CharInArray, но при портировании старого кода - малость раздражает.
Да. В 32-х битах - это не повторяется. На всякий случай повторил.
И "на самом деле" в первом примере значение csSetRusI равно ['и', 'И', #0, #2, #3]. Т.е. там какой-то "мусор". Завтра погляжу как это выглядит в ассемблере.
Исправили видать уже. Нет бага в Не Delphi Berlin 10.1 Pro. Ассемблерного кода тоже нет (это ж константы!), даже в отладочном профиле компилятор предвычисляет всё на этапе компиляции.
ОтветитьУдалитьs/в Не Delphi/в Delphi/
УдалитьНу видимо исправили.
УдалитьНу так константы в коде можно же посмотреть. Либо это битовая маска, либо массив.
Нет, нельзя. :) Там код сразу сжимается в raise EAssertionFailed.Create(<...>); потому что компилятор уже просчитал, что никаких других вариантов быть не может.
УдалитьНе ну понятно, что в ассемблере надо смотреть нерафинированный пример. Например со временной переменной. Чтобы компилятору было нечего оптимизировать.
Удалить