function hash(Word: Ada.Strings.Unbounded.Unbounded_String) return Integer is
-- First, because there's no manipulation of the string's
-- contents, doing the work on an unbounded-string is
-- rather pointless... so let's do our work on a regular --' fix for formatting
-- [static-length] string.
Working : String := Ada.Strings.Unbounded.To_String(Word);
-- Second, you need types in your declarations.
h : Integer := 5381;
c : Character := 'e'; --(first charater of "Word");
begin
-- Why use a 'while' loop here? Also, what if the 'word' is
-- abracadabra, in that case c [the first letter] is the
-- same as the last letter... I suspect you want an index.
for Index in Working'Range loop -- Was: while c /= EOW loop --'
declare
-- This is where that 'c' should actually be.
This : Character renames Working(Index);
-- Also, in Ada characters are NOT an integer.
Value : constant Integer := Character'Pos(This); --'
begin
h := h*33 + value; -- PS: why 33? That should be commented.
-- We don't need the following line at all anymore. --'
--c := (next character of "Word");
end;
end loop;
return h mod 20;
end hash;
은 물론이 또한 에이다 2012
function hash_2012(Word: Ada.Strings.Unbounded.Unbounded_String) return Integer is
-- Default should be explained.
Default : Constant Integer := 5381;
Use Ada.Strings.Unbounded;
begin
-- Using Ada 2005's extended return, because it's a bit cleaner.
Return Result : Integer:= Default do
For Ch of To_String(Word) loop
Result:= Result * 33 + Character'Pos(Ch); --'
end loop;
Result:= Result mod 20;
End return;
end hash_2012;
에 새로운 루프 구조를 활용하기 위해 다시 작성할 수 있습니다 ... 그리고 내가 물어있어, 무엇을 포매터에게 무슨 일이 일어난거야? 이것은 단지 무섭다.
아, 그래 ... 아마도 오버플로 문제를 해결하고 싶을 것입니다. 당신이 매번 33을 곱하고 있기 때문에 그것은 소수의 문자보다 더 많은 문자열을 위해 정수를 오버 플로우시킬 것입니다. 2^31/(33 + 65) = 21913098 ... 모든 캐릭터가이 캐릭터의 가치를 더하고 있음을 고려하지 않았습니다. – Shark8