2014-11-16 1 views
-1

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

Что я могу быть видом? Вот мой код.

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; 
+0

Здесь недостаточно, чтобы воспроизвести проблему. –

+0

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

+1

Ввод, скорее всего, был выполнен с помощью 'UnicodeString', а затем преобразован в' AnsiString', поэтому данные, вероятно, «появились», похожие на человеческий глаз, но на самом деле совсем другие память, которую будет замечать 'CompareStr()'. Недостаточно взглянуть на строковые значения в отладчике, вам нужно посмотреть на необработанные байты. Разница в 65 означает, что вы имеете дело с символами ANSI вне диапазона ASCII. –

ответ

2

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

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

на основе параметров порядка comment:

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

Это как раз проблема.

+1

Это было бы совершенно очевидно, если бы пользователь выполнил некоторую отладку –

1

Обе переменные AnsiStrings, оба то же самое значение, и нет никаких мест.

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

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

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

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

Смежные вопросы