Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создание связного списка [D7, Win2k]


Страницы:   1 2

polar ©   (2005-09-09 10:40:00) 

Добрый день.
есть такой код:
 PCollisionList = ^TCell;
 TCollisionList = PCollisionList;

 TCell = record
   Key, Data: string;
   Next: PCollisionList;
 end;

 THashTable = array of TCollisionList;
 TDataList = array of string;

 procedure CreateHashTable(aHashSize: longint; var aHashTable: THashTable);
 procedure ClearHashTable(var aHashTable: THashTable);
 function HashFunction(aKey: string; var aHashTable: THashTable): longint;
 procedure HashInsert(aKey, aData: string; var aHashTable: THashTable);
 function HashSearch(aKey: string; var aDataList: TDataList; var aHashTable: THashTable): boolean;

procedure CreateHashTable(aHashSize: longint; var aHashTable: THashTable);
begin
 try
   SetLength(aHashTable, 0);
   SetLength(aHashTable, aHashSize);
 except on e: Exception do begin
   SetLength(aHashTable, 0);
   e.Message := 'CreateHashTable: ' + e.Message;
   raise;
 end; end;
end;

procedure ClearHashTable(var aHashTable: THashTable);
 var tmpI: integer;
begin
 try
   for tmpI := 0 to Length(aHashTable)-1 do begin
     if assigned(aHashTable[tmpI]) then begin
       Dispose(aHashTable[tmpI]);
     end;
   end;
   SetLength(aHashTable, 0);
 except on e: Exception do begin
   SetLength(aHashTable, 0);
   e.Message := 'ClearHashTable: ' + e.Message;
   raise;
 end; end;
end;

function HashFunction(aKey: string; var aHashTable: THashTable): longint;
 var tmpI: integer;
begin
 try
   result := 0;
   for tmpI := 1 to Length(aKey) do result := result + Integer(aKey[tmpI]);
   result := result mod Length(aHashTable);
 except on e: Exception do begin
   e.Message := 'HashFunction: ' + e.Message;
   raise;
 end; end;
end;

procedure HashInsert(aKey, aData: string; var aHashTable: THashTable);
 var tmpIndex: longint;
     tmpPCollisionList: PCollisionList;
begin
 tmpIndex := HashFunction(aKey, aHashTable);
 New(tmpPCollisionList);
 try
   tmpPCollisionList^.Key := aKey;
   tmpPCollisionList^.Data := aData;
   tmpPCollisionList^.Next := aHashTable[tmpIndex];
   aHashTable[tmpIndex] := tmpPCollisionList;
 except on e: Exception do begin
   Dispose(tmpPCollisionList);
   e.Message := 'HashFunction: ' + e.Message;
   raise;
 end; end;
end;

function HashSearch(aKey: string; var aDataList: TDataList; var aHashTable: THashTable): boolean;
 var tmpPCollisionList: PCollisionList;
     tmpExpectedIndex: longint;
begin
 tmpExpectedIndex := HashFunction(aKey, aHashTable);
 tmpPCollisionList := aHashTable[tmpExpectedIndex];
 SetLength(aDataList, 0);
 result := false;

 while (tmpPCollisionList <> nil) do begin
   if tmpPCollisionList^.Key = aKey then begin
     result := true;
     SetLength(aDataList, Length(aDataList) + 1);
     aDataList[High(aDataList)] := tmpPCollisionList^.Data;
   end;
   tmpPCollisionList := tmpPCollisionList^.Next;
 end
end;

При этом всё хорошо, но процедура ClearHashTable не чистит память. Не понимаю почему.
Спасибо, если кто-то откликнется.


polar   (2005-09-09 11:24:00) [21]

Дело не использовании отладчика. Я что-то не освобождаю в ClearHashTable. Не вижу что. В отладчике этого не видно.


Digitman   (2005-09-09 11:10:00) [22]

как думаешь - отладчик встроенный зачем существует в Делфи ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо