Проблема с русскими буквами в конструкции IN [....]

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Проблема с русскими буквами в конструкции IN [....]

Сообщение vladgul » 27.12.2022 19:07:03

Прошу помощи,
есть конструкция из кода на Delphi
Код: Выделить всё
  if S[Length(S)] in ['A'..'Z', 'a'..'z', 'А'..'Я', 'а'..'я', ' '] then

Lazarus при компиляции ругается на 'A' русскую
CTCV.pas(2657,43) Error: Incompatible types: got "WideChar" expected "Char"
но попытка привести S[Length(S)] и к WideChar и даже к Char успеха не приносят.

Хотя такая конструкция после приведения типа стала проходить , а раньше ругался также Error: Incompatible types: got "WideChar" expected "Char"
Код: Выделить всё
      case WideChar(UpCase(Str[i])) of
        'А': Str[i] := 'A';
        'В': Str[i] := 'B';
        'С': Str[i] := 'C';
        'Е': Str[i] := 'E';
        'Н': Str[i] := 'H';
        'К': Str[i] := 'K';
        'М': Str[i] := 'M';
        'О': Str[i] := 'O';
        'Р': Str[i] := 'P';
        'Т': Str[i] := 'T';
        'Х': Str[i] := 'X';
        'У': Str[i] := 'Y';
      end;


В чем может быть здесь проблема? Подскажите, пожалуйста.
vladgul
незнакомец
 
Сообщения: 5
Зарегистрирован: 27.12.2022 18:53:24

Re: Проблема с русскими буквами в конструкции IN [....]

Сообщение Ichthyander » 27.12.2022 20:33:44

Не работает для UTF8. Только для AnsiChar. UTF8 уже не может быть перечислимым типом, если кратко
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 675
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Проблема с русскими буквами в конструкции IN [....]

Сообщение SSerge » 29.12.2022 04:17:09

vladgul у вас Str[i] - уже не буква.
Если не верите, попробуйте вывести строку задом наперёд конструкцией:
Код: Выделить всё
i:=length(Str);
while i>0 do begin
  write(Str[i]);
  dec(i);
end;


да и само значение length для строки с русскими буквами вполне показывает, что число позиций в массиве не соответствует количеству именно букв.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Проблема с русскими буквами в конструкции IN [....]

Сообщение wavebvg » 29.12.2022 19:13:41

Операция in предполагает использование битовой арифметики.
Для Byte (1 байт) потребуется 256/8 Байт = 32Байтная маска.
Для Word (2 байта) потребуется 65536/8 Байт = 8КБайтная маска.
Второй вариант уже явно перебор решать с помощью маски :-)

Вариант с использованием более сложного алгоритма поиска и сравнения пока не рассматривается (хотя для case все работает), поэтому и получаем, что для Char всё работает, а для остальных вариантов нет.

Есть несколько синтетических вариантов, когда можно малой кровью получить приемлемый по скорости результат без большущей векторной маски, но они сейчас не реализованы.
wavebvg
постоялец
 
Сообщения: 354
Зарегистрирован: 28.02.2008 04:57:35


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29

Рейтинг@Mail.ru