Невозможно назначить массив символов для строки в Delphi 10.2 - PullRequest
0 голосов
/ 17 октября 2018

У меня есть следующие объявления переменных:

arrChar_1: array[0..2] of Char;
arrChar_2: array[0..2] of Char;
str: string;

Затем я сделал назначение:

str := arrChar_1 + arrChar_2;

Это назначение работает нормально в Delphi 6. Но ошибка возникает, когда я компилирую егоDelphi 10.2:

[dcc32 Error] MigrateConcatenateCharArray.dpr(26): E2008 Incompatible types

Я решаю эту проблему следующим образом:

str := Copy(first_arrChar, 0, StrLen(first_arrChar));
str := str + Copy(second_arrChar, 0, StrLen(second_arrChar));

Есть ли еще какое-нибудь хорошее решение этой проблемы?(1)


В Delphi 6:

String = AnsiString
Char = AnsiChar

В Delphi 10.2:

String = UnicodeString
Char = WideChar

Можете сказать, что вызваловозникнет проблема несовместимости?(2)

Я понимаю, что widechar - это многобайтовый тип символов.Юникод - это способ кодирования символов.Но я запутался в них.

1 Ответ

0 голосов
/ 17 октября 2018

Следующие компиляции во всех версиях Delphi:

procedure Main;
var
  arrChar_1: array[0..2] of AnsiChar;
  arrChar_2: array[0..2] of AnsiChar;
  str: AnsiString;
begin
  str := arrChar_1 + arrChar_2;
end;

Следующий код не компилируется в Unicode-версиях Delphi:

procedure Main;
var
  arrChar_1: array[0..2] of WideChar;
  arrChar_2: array[0..2] of WideChar;
  str: UnicodeString;
begin
  str := arrChar_1 + arrChar_2;
end;

Это кажется мне немного странным.Почему оператор конкатенации должен поддерживаться для AnsiChar массивов, а не WideChar массивов?

Если вы посмотрите, как реализован оператор конкатенации для массивов AnsiChar, который начинает проливать некоторый свет.Сгенерированный код сначала преобразует массивы в ShortString экземпляры.Затем они преобразуются в экземпляры Delphi AnsiString.Наконец, два экземпляра AnsiString объединяются.

Теперь это объясняет, почему код не выполняется для массивов WideChar.Тип ShortString поддерживает только элементы AnsiChar, поэтому потребуется другой путь в подпрограммах поддержки строк.Можно предположить, что дизайнеры Embarcadero по какой-то причине решили не поддерживать эту форму конкатенации при реализации поддержки Unicode.

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

procedure Main;
var
  arrChar_1: array[0..254] of AnsiChar;
  arrChar_2: array[0..254] of AnsiChar;
  str: AnsiString;
begin
  str := arrChar_1 + arrChar_2;
end;

Компилируется.Но измените верхнюю границу 254 на 255, и код не сможет скомпилировать (во всех версиях Delphi) отчет о E2008 несовместимых типах .Это связано с тем, что массив теперь превышает максимальную длину объекта ShortString.

Что касается переноса кода в Unicode Delphi, я предлагаю просто преобразовать массивы символов в string:

str := string(arrChar_1) + string(arrChar_2);
...