cnpack / cnvcl

CnPack VCL Components

Home Page:http://www.cnpack.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

CnHashTable.pas 不支持 XE10版本..

keyshuwen opened this issue · comments

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

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

请问具体遇到了什么问题?我的理解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 测试没问题了 非常感谢.