Closed keyshuwen closed 5 years ago
请问具体遇到了什么问题?我的理解LStr1与LStr2并不是直接依赖长度,而是取其首地址,根据首字节内容、并回退找到长度等数据进行比较。
@shanzhashu
HashTableSmall = class(TCnHashTableSmall)
遇到 function TCnHashTable.Exists(const s: string): Boolean; //例如 if Self.Exists('0123') then begin //我确定表里没有重复.. 也会执行到这里来... Exit; end; 这就是我遇到的问题.....
LStr1 := TCnNativeInt((S1)); LStr2 := TCnNativeInt((S2)); 改成 LStr1 := TCnNativeInt(AnsiString(S1)); LStr2 := TCnNativeInt(AnsiString(S2)); 就不会出现这个问题.. 这是我实际情况中 遇到的问题. 谢谢解答.
补充.....
//例如 如果表里有 0108这样的字符串... 这样执行 if Self.Exists('0123') then begin //会执行到这里.. Exit; end;
好的,我马上查一下。
是否是类似的测试代码? ht := TCnHashTableSmall.Create; ht.Add('0108', nil); if ht.Exists('0123') then ShowMessage('Exist');
在10.3下貌似进不了ShowMessage
感谢报告,我刚查了一下代码,CompareString里对Unicode的处理确实漏了宽字符。我刚修正了这个问题,github上已经提交,烦请pull下来尝试一下?
@shanzhashu 测试没问题了 非常感谢.
CnHashTable.pas . 列表..
function TCnBucket.CompareStrings(const S1, S2: string): Integer;
因为XE宽字符变更. LStr1 , LStr2 依赖的是长度. 这里转换不正确. LStr1 := TCnNativeInt((S1)); LStr2 := TCnNativeInt((S2)); 改为 LStr1 := TCnNativeInt(AnsiString(S1)); LStr2 := TCnNativeInt(AnsiString(S2));
不知道是否正确................