Entwickler-Ecke

Sonstiges (Delphi) - Pointer - Elemente alphabetisch sortieren


kuschelfreddy - Fr 27.02.09 19:46
Titel: Pointer - Elemente alphabetisch sortieren
Hallo ihr alle!
Ich habe mal wieder ein Problem und bin mir sicher, dass ich hier einige Spezialisten finde, die mir gerne weiterhelfen!
Wir haben in der Schule die Aufgabe bekommen, ein Programm mit Pointern zu schreiben, dem Inhalte übergeben werden und das sie in der richtigen alphabetischen Reihenfolge ausgibt. Ich habe mir natürlich meine Gedanken dazu gemacht und auch etwas programmiert, was mir durchaus logisch erschien. Allerdings bekam ich jedes Mal, wenn ich auf einlesen drückte nur eine Fehlermeldung zu sehen und finde leider das Problem nicht.
Deshalb im Anhang besagte Fehlermeldung und das Programm mit relativ ausführlichen Anmerkungen, was ich mir dabei so gedacht habe, die euch hoffentlich nicht verwirren.
Hoffe, ihr könnt mir bei der Lösung des Problems helfen, sodass ich ein gescheites Programm erstellen kann. Schon mal ein dickes Dankeschön im Voraus!
LG und schönes WE!
Nathalie

Moderiert von user profile iconNarses: BMP -> PNG


Delete - Fr 27.02.09 20:01

Schau mal hier: Tutorial zu verketteten Listen [http://moonraven.kilu.de/index.php?option=com_remository&Itemid=2&func=fileinfo&id=4]


jaenicke - Fr 27.02.09 20:16


Delphi-Quelltext
1:
until memo2.lines[a]='';                    
Das ist keine so gute Idee, prüfe das besser so:

Delphi-Quelltext
1:
until a >= Memo2.Lines.Count;                    
So prüfst du tatsächlich die Anzahl und nicht den Inhalt. Wenn du auch bei der ersten Leerzeile abbrechen willst, dann mach es so:

Delphi-Quelltext
1:
until (a >= Memo2.Lines.Count) or (Trim(Memo2.Lines[a]) = '');                    

Zum Fehler kann ich schon einmal sagen, dass er hier liegt:

Delphi-Quelltext
1:
2:
3:
                repeat
                  hilfe:=hilfe^.richtung;         //gesucht wird die Position, die sich vor dem auf das neu erstellte Element folgende Element
                until hilfe^.richtung=lauf^.richtung; //befindet
An der Stelle wird hilfe nil, du versuchst aber trotzdem weiter darauf zuzugreifen.

Das findet man aber eigentlich mit dem Debugger relativ schnell heraus... Einfach mit F8 zeilenweise schnell durchgehen bis man die Stelle hat, an der der Fehler auftritt, dann dort einen Haltepunkt setzen, neu starten, immer mit F9 fortsetzen und zählen beim wievielten Mal der Fehler auftritt.
Und schon kannst du gezielt bis genau dort gehen bevor der Fehler auftritt. ;-)


kuschelfreddy - Fr 27.02.09 20:42

Hallo!
Danke schon mal für die schnellen Antworten, aber wenn ich ehrlich bin, habe ich das Problem immer noch nicht richtig erkannt! Vllt. bin ich auch einfach zu blöd, aber wieso setze ich denn hilfe auf nil in besagter Schleife??? Ich will es doch nur so lange weiterlaufen lassen, bis ich das Element gefunden habe, hinter das ich das neue einfügen muss, nachdem ich das, was dahinter kommt schon gefunden habe...
LG Nathalie


jaenicke - Fr 27.02.09 23:29

Dein Problem sind deine repeat Schleifen. Der Schleifeninhalt wird einmal ausgeführt, auch wenn die Bedingung nicht erfüllt ist. Du überspringst hier einfach das gesuchte Element:

Delphi-Quelltext
1:
2:
3:
                repeat
                  hilfe:=hilfe^.richtung;         //gesucht wird die Position, die sich vor dem auf das neu erstellte Element folgende Element
                until hilfe^.richtung=lauf^.richtung; //befindet
Denn in Hilfe steht da ja Start, also Katze --> Hund --> Haus. Dann kommt das "hilfe:=hilfe^.richtung", jetzt ist da drin Hund --> Haus, lauf^.richtung wäre aber Hund, das ist aber jetzt das aktuelle Element und kann nicht mehr gefunden werden.

Das ist ein Debugscreenshot genau an der Stelle, links siehst du die aktuellen Werte (im Anhang liegt das selbe Bild):
user defined image
Das gesuchte lauf^.richtung ist dort markiert, dadrunter siehst du den Inhalt von hilfe. In dem Moment, in dem du an der Zeile ankommt, wäre in richtung das gesuchte Element. Nach der Zeile ist aber hilfe selbst das gesuchte Element.

// EDIT:
Ach ja:
Überleg mal was passiert, wenn gar keine zweite Zeile existiert an dieser Stelle (zur Erinnerung: a ist 1):

Delphi-Quelltext
1:
2:
3:
  repeat
    new(lauf);                                    //erstellen eines neuen Elements, auf das lauf zeigt
    lauf^.inhalt:=memo2.lines[a];                 //zuordnen eines Inhaltes zu dem erstellten Element
Das ist das selbe Problem.


kuschelfreddy - So 01.03.09 18:56

OK, ich hab das Problem verstanden, die Erklärung war echt gut! Vielen Dank!
Jetzt muss ich nur noch eine Lösung suchen, wenn ich da nicht weiter komme, melde ich mich wieder! =)
LG Nathalie