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!?