-1

我有一个 Tree 迭代的比较运算符。它使用 AnsiString 变量。我的问题是,当值看起来相等时,我没有得到相等的指示符(也就是没有从 System.AnsiStrings.CompareStr 得到 0)。我已经通过调试器查看了我的变量并单步执行了我的代码。两个变量都是 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;
4

2 回答 2

2

有趣的是,65 是 和 之间的A差异#0

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

基于OP的评论

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

这正是问题所在。

于 2014-11-17T09:37:38.057 回答
1

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

你似乎弄错了,CompareStr否则说。两个字符串不相等。在这种情况下,最好是怀疑自己,而不是怀疑库函数不正确。

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

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

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

于 2014-11-17T08:02:23.003 回答