Delphi Fehler in Sortieralgorithmus? Finde ihn nicht

Frieso

Lt. Commander
Registriert
März 2009
Beiträge
1.485
Hi,

Ich bin grade dabei für die schule ein Demoprogramm zu schreiben, das Einen String nach dem huffmanalgorithmus codiert.
Nun habe ich allerdings ein problem und habe absolut keine idee, was das problem ist.

Ausgagspunkt (soweit funktioniert das Programm auch sicher!):
Ich habe eine Liste aus elementen, welche jeweils ein Zeichen (Char) und die jeweilige Anzahl(Integer) enthalten.
Diese habe ich auch einem String erzeugt. Das funktioniert auch alles so weit.

Jetzt möchte ich diese Liste Aufsteigend Sortieren. Dazu habe ich mich für InsertionSort Entschieden und das auch implementiert...Hier ist jetzt das Problem: Wenn der String Leerzeichen enthält (und einige andere fälle, ich bin mir noch nicht ganz sicher) hängt das programm sich auf und ich muss es beenden. Ohne Leerzeichen funktioniert alles ohne probleme genau wie ich es will.

Hier ist der Code des Sortieralgorithmus:
Charlist ist die liste aus den Elementen (Char und Anzahl)
getObject hold das aktuelle objekt aus der Liste, getFrequency liefert mit die Anzahl (tCharCounter heißt die klasse womit ich die einzelnen Zeichen+Anzahl Speicher)
insert Fügt ein objekt vor dem aktuellen ein
append hängt eins ans ende der Liste
Code:
procedure tHuffmanCoder.CharListSort;
var helplist: tList;
begin
helplist:=tList.create;
while not Charlist.isEmpty do
  begin
    CharList.toFirst;
    helplist.toFirst;
    while (helplist.hasAccess) AND (tCharCounter(helplist.getObject).GetFrequency<tCharCounter(CharList.getObject).GetFrequency)
    do helplist.next;
    if helplist.hasAccess
    then helplist.insert(CharList.GetObject)
    else helplist.append(CharList.getObject);
    CharList.remove;
  end;
CharList.concat(helplist);
CharList.toFirst;
helplist.destroy;
end;

Fals ich noch infos braucht einfach fragen, ich bin mir nicht sicher ob man mein problem so versteht :freak:
Vielen dank schonmal
Frieso :)
 
hass access prüft ob ich zugriff auf die liste habe. Wenn ich neim letzten element next aufrufe würde ich von getObject NIL geliefert bekommen.
wenn ich als über das letzte element der liste hinaus gelaufen bin liefert hasAccess = false

GetFrequency ist einfach nur ein ganz normaler getter:
Code:
function tCharCounter.GetFrequency : Integer;
begin
  result  := Frequency
end;
 
Code:
 while (helplist.hasAccess) AND (tCharCounter(helplist.getObject).GetFrequency<tCharCounter(CharList.getObject).GetFrequency)
do helplist.next;
ist die stelle wo er hängt.
 
Hmmm, und was ist der Inhalt von helplist in dem Moment? Du kannst ja mal einfach mit dem Debugger weitersteppen und die Variablen beobachten. Dann solltest du feststellen was das Problem ist.

Irgendwie scheint ja die hasAccess Abfrage in Kombination mit helplist.next nicht so zu funktionieren wie du denkst.

HasAccess kommt mir komisch vor als Funktion. Gibts nicht so etwas wie atEnd?
 
Zuletzt bearbeitet:
function hasAccess: boolean
Die Anfrage liefert den Wert true, wenn es ein aktuelles Objekt gibt, sonst liefert sie den Wert false.
das ist die beschreibung von hasAccess

In der helplist sind die ersten paar elemente sortiert drinn. dann plötzlich kommt es zu einer endlosschleife. Die sollte doch eigentlich von hasAccess abgefangen werden?!
Hier nochmal der Code von hasAccess:
Code:
function tList.hasAccess: boolean;
begin
    result:= self.current <> Nil;
end;
 
Das kann eigentlich nur heissen, dass tList.next nicht dazu führt, dass self.current = nil ist wenn er am Ende der Liste angekommen ist. Next könnte z.B. einfach auf dem letzten Element bleiben.
 
"procedure next
Falls die Liste nicht leer ist, es ein aktuelles Objekt gibt und dieses nicht das letzte Objekt der Liste ist, wird das dem aktuellen Objekt in der Liste folgende Objekt zum aktuellen Objekt, andernfalls gibt es nach Ausführung des Auftrags kein aktuelles Objekt, d.h. hasAccess liefert den Wert false."

Und genau so ist es auch programmiert.... :(
 
wo kann ich das sehen? wir verwenden delphi 7 (... aaaalt)
 
Hmmm, sollte reichen mit der maus über die helplist variable zu fahren und auf ein popup zu warten. Ansonsten rechtsklick auf die variable und 'add watch'/'inspect' oder so.
 
nein er zeigt speicheradressen an.... komisch. Ich gehe nochmal alles langsam durch und melde mich dann nochmal :p
 
Habe den Fehler nun gefunden! :D Danke füe die hilfe
 
Zurück
Oben