0

フラグを指定してプログラムをコンパイルしたところ-Criot -gl、1 の代わりに多くの結果が得られました (実際、216 エラーの修正を探していました)。1 つ目は、単純なハッシュ関数である以下のコードです。これを修正する方法がわかりません。

function HashStr(s : string) : integer;
var h : integer;
var c : char;
begin
   h := 0;
   for c in s do
      h := ord(c) + 31 * h; { This is the line of error }
   HashStr := h;
end;

これがどのように範囲外になる可能性がありますか?

4

1 に答える 1

2

簡単に言えば、「zzzzzzzzzzz」という文字列があるとします。Ord(c) は 122 になるので、数列は

 H = 122 + (31* 0 ) = 122
 H = 122 +(31*122) = 3902
 H = 122 +(31*3902) = 121146

これは、16 ビット整数の 32767 制限を超えています。32 であるが int の場合、その制限を超えるのにさらに多くの反復は必要ありません。

于 2013-12-20T22:57:46.060 に答える