Delphi - AnsiString Не равно, но не знаю почему

У меня есть оператор сравнения для дерева итерации. Он использует переменные AnsiString. Моя проблема в том, что, когда значения кажутся равными, я не получаю равный индикатор (иначе не получаю 0 от System.AnsiStrings.CompareStr). Я посмотрел на мои переменные через отладчик и прошел через мой код. Обе переменные являются AnsiStrings, обе имеют одинаковое значение, пробелов нет. CompareStr возвращает -65, если это помогает.

Что я могу пропустить? Вот мой код

  function CompareNodes(idVal: pointer; ANode: TALStringKeyAVLBinaryTreeNode): Integer;
  var
    Key1, Key2: AnsiString;
  begin
    Key1 := PAnsiString(idVal)^;
    Key2 := ANode.ID;

    Result := System.AnsiStrings.CompareStr(Key1, Key2);
  end;

2 ответа

Решение

Интересно отметить, что 65 - это разница между A а также #0,

Так как линия Key1 := PAnsiString(idVal)^; выполняет непроверенное приведение типа idVal указатель, есть вероятность того, что idVal фактически ссылается на строку Wide/Unicode. Это будет означать Key1 пытается обработать не AnsiString, как если бы он был один.

На основании комментария ОП:

Нашел мой ответ.... Каким-то образом для ввода использовалась строка, а не AnsiString. -65 может быть индикатором, когда возникает такая ситуация...

Это именно проблема.

Обе переменные являются AnsiStrings, обе имеют одинаковое значение и пробелов нет.

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

Шаг 1 здесь будет добавить некоторый код отладки. Выведите две строки, когда они интерпретируются как двоичные. Запишите порядковый номер каждого символа в журнал отладки. Это покажет разницу.

CompareStr возвращает -65, если это помогает.

Реализация CompareStr сравнивает символ за символом и смотрит на разницу между порядковыми значениями. Пока разница всегда равна нулю, алгоритм может перейти к следующему следующему значению. Но когда ненулевое значение найдено, строки различаются, и возвращается ненулевое значение. Итак, первые отличающиеся символы имеют порядковые значения, которые отличаются на 65.

Другие вопросы по тегам