Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Подводные камни
  
О разделе

Список по категориям
Общий список

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  15:56[Войти] | [Зарегистрироваться]

Неверное сравнение Wide-строки и символа

Александр Алексеев
дата публикации 24-04-2008 02:49

КАТЕГОРИЯКОМПИЛЯТОР.Неверное сравнение Wide-строки и символа
ПРОДУКТDelphi
ПЛАТФОРМАWindows


Проверялось на Delphi 7.

Тестовый код:

var
  W: WideString;
begin
  W := 'я';
  if W[1] = 'я' then
    ShowMessage('Ok')
  else
    ShowMessage('Fail');
end;
Появляется надпись "Fail".

В строке

  W := 'я';
константа 'я' - это Unicode-строка (поскольку мы присваиваем её строке).

Компилятор Delphi берёт ANSI-представление строки ('я'), конвертирует его в Unicode (MultiByteToWideChar) и пишет в исполнимый модуль 4 байта: $4F040000 (первые два - код 'я', два последних - нуль-терминатор).

В строке

  if W[1] = 'я' then
константа 'я' рассматривается как символьная, поскольку мы сравниваем её с символом строки. А символьные константы компилятор Delphi всегда рассматривает как ANSI. А это значит, что константа 'я', являющаяся ANSI-символом, представляет собой код 255. И она сравнивается с первым WideChar-ом в строке W. Таким образом, у нас происходит сравнение:
$4F04 = $FF00?


Типовые решения
Единственная конструкция, которую мне удалось заставить работать, это:
  if W[1] = WideString('я')[1] then



Комментарий
Можно спорить о том, к какой категории относится этот камень - ПРОГРАММИСТ или КОМПИЛЯТОР. Но компилятор как средство, абстрагирующее программиста от особенностей представления Wide и ANSI символов и строк, должен обекспечивать автоматическую конверсию в подобных случаях. Код не должен меняться при замене ANSI строк на Wide, и правильность конструкций должна сохраняться.


Смотрите также материалы по темам:


 Обсуждение материала [ 29-07-2008 09:33 ] 12 сообщений
  
Время на сайте: GMT минус 5 часов

Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Функция может не работать в некоторых версиях броузеров.

Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

 
© При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
Все используемые на сайте торговые марки являются собственностью их производителей.

Яндекс цитирования