У меня есть вопрос о конкретной проблеме программирования в языке программирования Delphi 10.2 Pascal.
StringOfChar и FillChar не работают должным образом в Win64 Release build на процессорах, выпущенных до 2012 года.
-
Ожидаемый результат FillChar - это просто последовательность повторяющихся 8-битных символов в данном буфере памяти.
-
Ожидаемый результат StringOfChar тот же, но результат сохраняется внутри строкового типа.
Но на самом деле, когда я компилирую наши приложения, которые работали в Delphi до 10.2 с помощью версии Delphi 10.2, наши приложения, скомпилированные для Win64, перестали нормально работать на процессорах, выпущенных до 2012 года.
StringOfChar и FillChar работают неправильно - они возвращают строку разных символов, хотя в повторяющемся шаблоне - не просто последовательность того же символа, что и они.
Вот минимальный код, достаточный для демонстрации проблемы. Обратите внимание, что длина последовательности должна быть не менее 16 символов, а символ не должен быть nul (# 0). Код ниже:
procedure TestStringOfChar;
var
a: AnsiString;
ac: AnsiChar;
begin
ac := #1;
a := StringOfChar(ac, 43);
if a <> #1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1#1 then
begin
raise Exception.Create('ANSI StringOfChar Failed!!');
end;
end;
Я знаю, что в StackOverflow есть много программистов Delphi. Вы испытываете ту же проблему? Если да, как вы его разрешаете? Каково решение? Кстати, Я связался с разработчиками Delphi, но они до сих пор не подтвердили и не отрицали эту проблему. Я использую Embarcadero Delphi 10.2 Version 25.0.26309.314.
Update:
Если ваш процессор выпущен в 2012 году или позже, дополнительно включите следующие строки перед вызовом StringOfChar, чтобы воспроизвести проблему:
const
ERMSBBit = 1 shl 9; //$0200
begin
CPUIDTable[7].EBX := CPUIDTable[7].EBX and not ERMSBBit;
Как о Апрель 2017 RAD Studio 10.2 Исправление для проблем с инструментами - пробовал с ним и без него - это не помогло. Проблема существует независимо от исправления.