Einzelnen Beitrag anzeigen

Benutzerbild von Hannes91
Hannes91

Registriert seit: 28. Aug 2010
Ort: Hamburg
15 Beiträge
 
Delphi 2010 Professional
 
#1

Problem im Kompressionsprogramm

  Alt 4. Jun 2011, 09:09
Hallo zusammen,

zu Testzwecken habe ich vor kurzem mit der Arbeit an einem Kompressionsprogramm begonnen, welches auf der Burrows-Wheeler-Transformation aufbaut. Nachdem ich alle hierfür benötigten Module (BWT, Move-To-Front, RLE, Huffman) fertig gestellt hatte, wollte ich nun große Dateien hiermit blockweise kodieren, um die Performance zu steigern.

Folgenden Code (Auszug) verwende ich zur Kodierung im Modul "uHuffman.pas":

Delphi-Quellcode:
function THuffman.Kodieren (sText : TAusgabe) : TAusgabe;
var
   i, j, iPos: integer;
   sZeichenBin : TAusgabe;
   KodZeichen : Array [0..255] of Array of byte;
begin
     for i := 0 to 255
     do
       begin
            if Baum[i].iHaeufigkeit > 0
            then
                begin
                     iPos := i;
                   
                     while Baum[iPos].iVater > 0
                     do
                       begin
                            setlength(KodZeichen[i], length(KodZeichen[i]) + 1); /// <-------

                            if Baum[Baum[iPos].iVater].iLinks = iPos
                            then KodZeichen[i, High(KodZeichen[i])] := 0
                            else KodZeichen[i, High(KodZeichen[i])] := 1;

                            iPos := Baum[iPos].iVater;
                       end;
                end;
       end;
     ...
TAusgabe ist ein dynamisches Array of Byte.
KodZeichen beinhaltet nach Durchlaufen obigen Codes alle 256 möglichen Kodierungen, so müssen sie nur einmal berechnet werden und können bei der eigentlichen Kodierung abgeschrieben werden.

Nach der erfolgreichen Kodierung einiger Blöcke stürzt das Programm jedoch irgendwann an der mit dem Pfeil markierten Stelle mit einer Access Violation ab. Liegt es vielleicht an den häufigen setlength() Aufrufen?

Ich hoffe, ihr habt dazu irgendwelche Vorschläge. Anbei der gesamte Quelltext mitsamt der zu kodierenden Datei test.txt (ist die Programmdatei einer früheren Version).


Liebe Grüße

Hannes



PS: Der Fehler von heute morgen tritt nun nicht mehr auf (kein Absturz beim Einlesen von Blöcken), vielleicht handelt es sich jedoch um dieselbe Ursache!?
Angehängte Dateien
Dateityp: rar Gesamt.rar (164,4 KB, 14x aufgerufen)
Hannes

Geändert von Hannes91 ( 4. Jun 2011 um 18:20 Uhr)
  Mit Zitat antworten Zitat