cnpack / cnvcl

CnPack VCL Components
http://www.cnpack.org
335 stars 102 forks source link

CnHashTable.pas 不支持 XE10版本.. #7

Closed keyshuwen closed 5 years ago

keyshuwen commented 5 years ago

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));

不知道是否正确................

shanzhashu commented 5 years ago

请问具体遇到了什么问题?我的理解LStr1与LStr2并不是直接依赖长度,而是取其首地址,根据首字节内容、并回退找到长度等数据进行比较。

keyshuwen commented 5 years ago

@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)); 就不会出现这个问题.. 这是我实际情况中 遇到的问题. 谢谢解答.

keyshuwen commented 5 years ago

补充.....

//例如 如果表里有 0108这样的字符串... 这样执行 if Self.Exists('0123') then begin //会执行到这里.. Exit; end;

shanzhashu commented 5 years ago

好的,我马上查一下。

shanzhashu commented 5 years ago

是否是类似的测试代码? ht := TCnHashTableSmall.Create; ht.Add('0108', nil); if ht.Exists('0123') then ShowMessage('Exist');

在10.3下貌似进不了ShowMessage

keyshuwen commented 5 years ago

QQ图片20190430155021

shanzhashu commented 5 years ago

感谢报告,我刚查了一下代码,CompareString里对Unicode的处理确实漏了宽字符。我刚修正了这个问题,github上已经提交,烦请pull下来尝试一下?

keyshuwen commented 5 years ago

@shanzhashu 测试没问题了 非常感谢.