Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Проблема вывода символа с использованием спецификатора формата в `Write` из RAD Studio XE2 на Windows 7 x64

Delphi , ОС и Железо , DOS и Консоль

Объяснение поведения

При использовании спецификатора формата :WIDTH в функции Write в RAD Studio XE2 на операционной системе Windows 7 x64, пользователи сталкиваются с неожиданным поведением: вместо ожидаемого вывода символов с заданной шириной, в начале строки появляется символ вопроса ?. Это происходит, когда определена директива {$DEFINE BOO}, но если изменить тип константы ENGLISH_ALPHABET на AnsiString, проблема исчезает, как и при удалении спецификатора формата или его изменении на :1. Также, если вывод перенаправляется в файл, проблема не проявляется.

Причина

Проблема возникает из-за ошибки в компоненте Run-Time Library (RTL) Delphi. В функции _WriteWChar, которая используется при вызове Write, для вывода символов в UTF-16 буффер используется функция _WriteSpaces. Если буффер уже содержит символ конца строки, он заменяется на символ вопроса ?, что и приводит к неожиданному результату вывода.

Подробности реализации

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

Пример кода

program letters;
{$APPTYPE CONSOLE}
{$DEFINE BOO}
const
  ENGLISH_ALPHABET = 'abcdefghijklmnopqrstuvwxyz';
begin
  {$IFDEF BOO}
    writeln;
  {$ENDIF}
  write(ENGLISH_ALPHABET[1]:3);
  readln;
end.

Рекомендации

Чтобы избежать этой проблемы, можно использовать следующее решение:

  • Изменить тип константы ENGLISH_ALPHABET на AnsiString.
  • Удалить спецификатор формата или изменить его на :1.

Также, можно применить "костыль" для исправления функции _WriteWChar, но это не рекомендуется для производства, так как это может привести к нестабильности работы программы.

Статус в новых версиях

Проблема не была исправлена в версии XE7, но её можно обойти, следуя вышеупомянутым рекомендациям.

Дополнительные сведения

Для получения дополнительной информации и возможного решения проблемы, связанной с ошибками в RTL, можно использовать инструменты отладки и, при необходимости, обратиться в службу поддержки Embacadero или к сообществу разработчиков Delphi.

Создано по материалам из источника по ссылке.

При использовании функции `Write` с спецификатором формата `:WIDTH` в RAD Studio XE2 на Windows 7 x64 с определенной директивой `{$DEFINE BOO}` возникает проблема с выводом символов, вместо которых в начале строки появляется символ во


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: DOS и Консоль ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 22:10:23/0.0034389495849609/0