我有一个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;
答案 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.