Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.02.2012, 10:15   #1
stas45rus
Пользователь
 
Регистрация: 26.08.2011
Сообщений: 46
По умолчанию Архивация по Хаффману.

Всем привет. Помогите пжл. разобраться с кодом. Программа архивирует по алгоритму Хаффмана. Код создаёт по-моему создаёт правильный, а вот при архивации выдаёт переполнение кучи. Всё перепробовал. Может у кого-то есть время, громная просьба помочь. Вся программа не влезла, поэтому выкладываю 3 процедуры, в которых есть сомнения.
Код:
Procedure AssignmentCodeList(Root:Tree);
Begin
  {Присвоение кода листьям дерева}
  {Каждому узлу при построении дерева был присвоен бит Root^.Bit}
  Inc(CountCode); {счётчик пройденных узлов дерева}
  BitCode:=BitCode OR Root^.Bit; 
  BitCode:=BitCode SHL 1;
  If Root^.Left<>Nil Then AssignmentCodeList(Root^.Left);
  If Root^.Right<>Nil Then AssignmentCodeList(Root^.Right);
  If (Root^.Right=Nil) and (Root^.Left=Nil) Then
   begin
     Root^.Leng:=CountCode-1;
     Root^.Code:=BitCode SHR 1;
   end;
  BitCode:=BitCode SHR 1;
  Dec(CountCode);
End;
Код:
Procedure CompressionFile;
Begin
  Kol:=0; {Сумма длин кодов}
  Mask:=0;
  BitCode:=0;
  Seek(f,0);
  While not(eof(f)) Do
   begin
     BlockRead(f,Buf,1);
     Kol:=Kol+b[Buf]^.Leng;
     BitCode:=b[Buf]^.Code SHL (16-Kol);
     Mask:=Mask OR BitCode;
     If Kol>=8 Then
      begin
        n:=HI(Mask);
        BlockWrite(r,n,1);
        Mask:=Mask SHL 8;
        Kol:=Kol-8;
      end;
   end;
  If (eof(f)) and (Kol<>0) Then
   begin
     n:=Mask SHR 8;
     BlockWrite(r,n,1);
   end;
End;
Код:
Procedure DeCompressionFile(n:Byte; Count:Longint);
{Декомпрессия файла. Вот именно в этом месте выдаётся переполнение
 при разархивации больших файлов}
Begin 
  Current:=Root;
  While (Current^.Left<>Nil) and (Current^.Right<>Nil) Do
   begin
     If (n=0) and (not(eof(f))) and (Current^.Left<>Nil) and (Current^.Right<>Nil) Then
      begin
        BlockRead(f,Buf,1);
        Inc(n,8);
      end;
     If Count<>0 Then
      begin
        Kol:=Buf SHR 7;
        Buf:=Buf SHL 1;
        Dec(n);
        Dec(Count);
        If Kol=0 Then Current:=Current^.Left;
        If Kol=1 Then Current:=Current^.Right;
      end
     Else Exit;
   end;
  BlockWrite(r,Current^.Symbol,1);
  DeCompressionFile(n,Count);
End;
stas45rus вне форума Ответить с цитированием
Старый 15.02.2012, 17:41   #2
stas45rus
Пользователь
 
Регистрация: 26.08.2011
Сообщений: 46
По умолчанию

Народ, неужели опять никто не может помочь???
stas45rus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Архивация бд Garward Общие вопросы Delphi 4 04.06.2011 13:57
Архивация БД rpaa1 Помощь студентам 1 06.04.2011 21:04
Архивация БД dron-s БД в Delphi 0 10.03.2008 12:08
Архивация Mitron Общие вопросы Delphi 10 14.02.2008 16:00