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

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

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

Ответить
vladgul
незнакомец
Сообщения: 5
Зарегистрирован: 27.12.2022 17:53:24

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

Сообщение vladgul »

Прошу помощи,
есть конструкция из кода на 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;
В чем может быть здесь проблема? Подскажите, пожалуйста.
Аватара пользователя
Ichthyander
энтузиаст
Сообщения: 701
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань
Контактная информация:

Сообщение Ichthyander »

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

Сообщение SSerge »

vladgul у вас Str - уже не буква.
Если не верите, попробуйте вывести строку задом наперёд конструкцией:

Код: Выделить всё

i:=length(Str);
while i>0 do begin
  write(Str[i]);
  dec(i);
end;
да и само значение length для строки с русскими буквами вполне показывает, что число позиций в массиве не соответствует количеству именно букв.
wavebvg
постоялец
Сообщения: 355
Зарегистрирован: 28.02.2008 03:57:35

Сообщение wavebvg »

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

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

Есть несколько синтетических вариантов, когда можно малой кровью получить приемлемый по скорости результат без большущей векторной маски, но они сейчас не реализованы.
Ответить