Хобрук: Ваш путь к мастерству в программировании

Ошибка Delphi 2010 E2010 Несовместимые типы: Char и AnsiChar

Я загрузил код из Delphi, и когда я компилирую его внутри Delphi 2010, я получаю несовместимые типы E2010: 'Char' и 'AnsiChar'.

Как мне исправить эту ошибку? Помоги пожалуйста

function TFKirimEmail.ChAnsiToWide(const StrA: AnsiString): WideString;
var
  nLen: integer;
begin
  Result := StrA;
  if Result <> '' then
  begin
    nLen := MultiByteToWideChar(GetACP(), 1, PChar(@StrA[1]), -1, nil, 0);
    SetLength(Result, nLen - 1);
    if nLen > 1 then
      MultiByteToWideChar(GetACP(), 1, PChar(@StrA[1]), -1, PWideChar(@Result[1]), nLen - 1);
  end;
end;
29.06.2014

  • возможный дубликат Решить несовместимые типы E2010: 'AnsiChar' и 'Char' 29.06.2014
  • Я предполагаю, что код, который вы загрузили, был из версии Delphi до 2010 года. Вы должны знать, что с D2010 Unicode строго соблюдается, что означает PChar, вместо того, чтобы указывать на PAnsiChar, теперь он указывает на PWideChar. Предположительно, ваши случаи PChar должны быть преобразованы как PAnsiChar. 29.06.2014
  • Вы устраняете ошибку, удаляя функцию, потому что она вообще не нужна в вашем Unicode Delphi. Вы знаете, что такое Юникод? Вы знаете о UnicodeString и о том факте, что string теперь является псевдонимом для UnicodeString? Если вы вообще ничего не знаете о Unicode, вам не следует задавать этот вопрос. Прочтите технический документ Марко, и тогда вы будете готовы продолжить. 29.06.2014
  • @David Хороший улов, я даже не обратил внимания на то, что на самом деле делает функция, просто на то, что она использует PChar. 29.06.2014
  • @JerryDodge: Delphi перешла на Unicode в D2009, а не в D2010. 29.06.2014
  • Вы также должны спросить себя, почему у вас есть метод экземпляра класса TFKirimEmail, который выполняет преобразование строк и не использует никаких переменных экземпляра. Другими словами, этот код - не лучшее место для начала. 29.06.2014
  • @Remy Спасибо за это, я забыл, что есть даже Delphi 2009. 29.06.2014

Ответы:


1

В Delphi 2009 и более поздних версиях (P)Char является псевдонимом для (P)WideChar, тогда как в более ранних версиях это был псевдоним для (P)AnsiChar. Вот почему вы получаете ошибку компилятора.

Третий параметр MultiByteToWideChar() ожидает PAnsiChar во всех версиях Delphi. Так что просто замените PChar на PAnsiChar. Что будет работать нормально, учитывая, что StrA это AnsiString, а не String (который является псевдонимом для UnicodeString в D2009 +), поэтому они будут совпадать.

При этом вы должны использовать константу CP_ACP вместо функции GetACP(), удалить избыточное присвоение (и преобразование) Result перед вызовом MultiByteToWideChar(), удалить ненужную индексацию символов и удалить ненужную обработку нулевого терминатора:

function TFKirimEmail.ChAnsiToWide(const StrA: AnsiString): WideString;
var
  nLen: integer;
begin
  Result := '';
  nLen := MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, PAnsiChar(StrA), Length(StrA), nil, 0);
  if nLen > 0 then
  begin
    SetLength(Result, nLen);
    MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, PAnsiChar(StrA), Length(StrA), PWideChar(Result), nLen);
  end;
end;

С учетом сказанного, не используйте WideString в D2009 + для работы без ActiveX. UnicodeString эффективнее.

function TFKirimEmail.ChAnsiToWide(const StrA: AnsiString): UnicodeString;

Наконец, поскольку вы устанавливаете CodePage на ACP и параметр dwFlags на MB_PRECOMPOSED (что является значением по умолчанию, если не указаны другие флаги), вы можете просто исключить весь этот код и позволить RTL обрабатывать преобразование за вас, поскольку он использует те те же внутренние настройки по умолчанию:

function TFKirimEmail.ChAnsiToWide(const StrA: AnsiString): WideString;
begin
  Result := WideString(StrA);
end;

Or:

function TFKirimEmail.ChAnsiToWide(const StrA: RawByteString): UnicodeString;
begin
  Result := UnicodeString(StrA);
end;

В этом случае ваша ChAnsiToWide() функция становится избыточной и может быть полностью исключена.

29.06.2014
Новые материалы

Изучите Vue перед React. Вот почему
Сегодняшняя сеть представляет собой запутанный беспорядок из разных языков, библиотек и фреймворков, и начинающие веб-разработчики часто не могут понять, что изучать в первую очередь. Что вы..

Гл.31 — Помощь слабослышащим с помощью возможностей машинного обучения Apple Watch.
1 500 000 000  – количество людей с потерей слуха в мире. Это почти 20% населения Земли! (источник: who.int ) Недавно я экспериментировал с Apple Sound Classification API, и результаты на..

Машинное обучение без кода / Глубокое обучение Каждый специалист по обработке и анализу данных должен знать
Akkio, Очевидно.ай, DataRobot, Левити, Clarifai, Teachable Machines, Lobe, Pimer, DynaBench, APAflow Teachable Machine- https://teachablemachine.withgoogle.com/ Vertex AI..

Код, который работает вместе, остается вместе
Первоначально это было опубликовано в tiagojdf . Когда я только начинал как младший программист, я всегда терялся, глядя на внутренний код. Я предположил, что отчасти это было из-за того,..

Эта модель Google сочетает в себе рассуждение и действие в рамках одной языковой модели.
ReAct предоставляет архитектуру, которая инициирует действия на основе путей рассуждений языка. Недавно я запустил образовательный информационный бюллетень, посвященный ИИ, у которого уже..

Сортировка структур JSON по нескольким полям в JavaScript
Array.sort() не для слабонервных. Особенно, когда речь идет о сортировке сложных структур данных. Большинство руководств по JavaScript дают только краткое введение в Array.sort() . Обычно..

Иллюзии разработки программного обеспечения
Многие вещи не то, чем кажутся Реальность — это всего лишь иллюзия, хотя и очень настойчивая. Альберт Эйнштейн Разработка программного обеспечения никогда не бывает такой, какой кажется...