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.