德尔福 - AnsiString不等于但不知道为什么

时间:2014-11-16 23:54:00

标签: delphi ansistring

我有一个Tree迭代的比较运算符。它使用AnsiString变量。我的问题是,当值看起来相等时,我没有得到一个相等的指标(也就是从System.AnsiStrings.CompareStr得不到0)。我通过debbugger查看了我的变量并逐步完成了我的代码。两个变量都是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 个答案:

答案 0 :(得分:2)

值得注意的是,65是A#0之间的差异。

由于行Key1 := PAnsiString(idVal)^;执行idVal指针的未经检查类型转换,因此idVal实际上可能是指宽/ Unicode字符串。这意味着Key1正在尝试将 AnsiString视为一个。

基于OP的comment

  

找到我的答案....不知何故,一个字符串被用于输入,而不是AnsiString。当这种情况发生时,-65可能是一个指标......

这正是问题所在。

答案 1 :(得分:1)

  

两个变量都是AnsiStrings,两者都是相同的值,并且没有空格。

你似乎错了,CompareStr另有说法。两个字符串不相等。在这样的情况下,最好是怀疑自己而不是怀疑库函数是不正确的。

这里的步骤1将添加一些调试代码。解释为二进制时输出两个字符串。将每个字符的序数值写入调试日志。这将揭示差异。

  

如果有帮助,CompareStr会返回-65。

CompareStr的实现逐个字符地比较,并查看序数值之间的差异。只要差异始终为零,则算法可以继续下一个下一个值。但是当找到非零值时,字符串不同并返回非零值。因此,第一个不同的字符的序数值相差65.