![]() |
TString führt "pop" nicht aus
Hallo Delphi-Praxis Community,
ich soll in meinen Informatikunterricht ein Programm schreiben, in dem es drei Gleise gibt, im ersten Gleis sind mehrere Waggons mit zufälligen Zahlenwerten. Diese sollen sich nun sortiert in das dritte Gleis einreihen, also wie Türme von Hanoi. Mein Problem ist jetzt aber nicht die Schleife zum Sortieren oder die Ausgabe, sondern, dass nichts passiert, wenn ich StackA.pop ausführe. Dieser Befehl sollte den ersten Waggon löschen. Ich habe das Programm schon so extrem reduziert, wie mir möglich ist, also kein Verschieben oder Generieren von mehreren Zahlen durch eine Schleife etc... Nur das Auswählen und Löschen von StackA.top, und Button3 für die Ausgabe. Ich gebe euch hier mal den Code vom Programm und von den zwei Klassen (die mStack Klasse ist von meinem Lehrer gegeben). Ich hoffe mal jemand sieht den vermutlich viel zu offensichtlichen Fehler (denn mein Lehrer, diverse andere Schüler und ich haben es nicht getan). Danke schon im Voraus!
Delphi-Quellcode:
unit ZUUUG;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, mStack, mWaggon, Vcl.StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; ListBox1: TListBox; ListBox2: TListBox; ListBox3: TListBox; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private-Deklarationen } public ListeA:TStack; Zug:Waggon; //ListeB:TStack; //ListeC:TStack; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin Zug.SetzeInhalt(random(100)); ListeA.push(Zug); ListBox1.Items.Insert(0,(inttostr(Zug.GibInhalt))); end; procedure TForm1.Button2Click(Sender: TObject); begin ListeA.top; ListeA.pop; {if Listec.isEmpty then begin Listec.push(Listea.top); Listea.top; listea.pop; Zug.SetzeInhalt((ListeA.top as waggon).GibInhalt); Listbox3.Items.Insert(0,(inttostr((Listec.top as waggon).GibInhalt))); end else begin if ((Listec.top as Waggon).GibInhalt)<((Listea.top as Waggon).GibInhalt) then begin Listec.push(Listea.top); listea.top; Listea.pop; Listbox3.Items.Insert(0,(inttostr((Listec.top as waggon).GibInhalt))); end; end;} end; procedure TForm1.Button3Click(Sender: TObject); begin showmessage(inttostr((Listea.top as waggon).GibInhalt)) end; procedure TForm1.FormCreate(Sender: TObject); begin ListeA:= TStack.create; //ListeB:= TStack.create; //ListeC:= TStack.create; Zug:= Waggon.Create; end; end.
Delphi-Quellcode:
UNIT mWaggon;
interface //-------------------- ggf Uses-Liste einfügen ! -------------------- //uses ....; type Waggon = class protected //Attribute Inhalt : integer; public //Methoden procedure SetzeInhalt (pInhalt: integer); virtual; function GibInhalt : integer; virtual; end; implementation //+--------------------------------------------------------------------- //| Waggon: Methodendefinition //+--------------------------------------------------------------------- //-------- SetzeInhalt (public) ---------------------------------------- procedure Waggon.SetzeInhalt (pInhalt: integer); begin Inhalt := pInhalt end; //-------- GibInhalt (public) ------------------------------------------ function Waggon.GibInhalt : integer; begin result := Inhalt end; end.
Delphi-Quellcode:
(*
* Materialien zu den zentralen Abiturpruefungen * im Fach Informatik ab 2012 in Nordrhein-Westfalen. * * Klasse TStack * * NW-Arbeitsgruppe: * Materialentwicklung zum Zentralabitur im Fach Informatik * * Version 2010-12-28 *) unit mStack; interface type TNode = class private content: TObject; nextNode: TNode; constructor create(pObject: TObject); procedure setNext(pNode: TNode); function getContent: TObject; function next: TNode; destructor destroy; override; end; TStack = class private topNode: TNode; public constructor create; virtual; function isEmpty: boolean; virtual; function top: TObject; virtual; procedure pop; virtual; procedure push(pObject: TObject); virtual; destructor destroy; override; end; implementation // TNode constructor TNode.create(pObject: TObject); begin content := pObject; nextNode := nil; end; procedure TNode.setNext(pNode: TNode); begin nextNode := pNode; end; function TNode.next: TNode; begin result := nextNode; end; function TNode.getContent: TObject; begin result := content; end; destructor TNode.destroy; begin inherited destroy; end; // TStack constructor TStack.create; begin topNode := nil; end; function TStack.isEmpty: boolean; begin result := topNode = nil; end; procedure TStack.push(pObject: TObject); var tempNode: TNode; begin if pObject <> nil then begin tempNode := TNode.create(pObject); if self.isEmpty then topNode := tempNode else begin tempNode.setnext(topNode); topNode := tempNode; end; end; end; procedure TStack.pop; var tempNode: TNode; begin if not self.isEmpty then begin tempNode := topNode; topNode := topNode.next; tempNode.destroy; end; end; function TStack.top: TObject; begin if not self.isEmpty then result := topNode.getContent else result := nil; end; destructor TStack.destroy; begin while not self.isEmpty do self.pop; inherited destroy; end; end. |
AW: TString führt "pop" nicht aus
Ups, es sollte natürlich heißen : "TStack führt pop nicht aus"
|
AW: TString führt "pop" nicht aus
Ich denke eher, dass pop durchaus ausgeführt wird. Funktioniert denn nach dem Klicken von Button2 noch Button3, wenn du nur einen Waggon hinzugefügt hattest?
Das reine Entfernen aus deinem Stack führt aber nicht dazu, dass du auch etwas siehst. Denn was du in deinem Fenster siehst ist nur die Listbox, und die änderst du ja nicht beim Entfernen. Du musst also beim Ändern des Stack auch deine Listbox ändern. Beim Hinzufügen fügst du den Eintrag auch in die Listbox hinzu. Was musst du also beim Entfernen machen? Den ersten Eintrag auch aus der Listbox löschen würde ich vorschlagen. ;-) (Wobei du vorher prüfen solltest, ob der Stack leer ist.) Dann noch eine Bemerkung am Rande: In der vorgegebenen Unit mStack heißt der Stack TStack. Das T ist dabei ein Kennzeichen dafür, dass es sich um eine Klasse handelt. Dann kann man besser erkennen, dass es die Klasse ist (der Bauplan für einen Waggon) und kein konkret erzeugtes Objekt (das einen existierenden Waggon repräsentiert). Deshalb solltest du auch deine Klasse Waggon besser TWaggon nennen. |
AW: TString führt "pop" nicht aus
Hallo,
ich hätte gesagt, es gibt nur einen Waggon. In diesen wird der neue Wert eingetragen und der alte überschrieben. Beim Lesen wird dann immer der zuletzt eingetragene Wert angezeigt. Pop ist OK. Und noch so ein Gedanke: bei dir ist Zug = Waggon - Zug: Waggon. Ich kenne die Aufgabenstellung nicht, aber logisch wäre aus meiner Sicht, wenn ein Zug aus mehreren Waggons bestehen könnte. Es kann aber auch sein, dass in einem Waggon mehrere Ladungen transportiert werden. Dann müsste aber der Waqgon anders definiert sein. Benutze mal den Debugger - dann wird sich das Problem rasch lösen. |
AW: TString führt "pop" nicht aus
Ja, stimmt, es wird auch nur ein Waggon beim Programmstart erzeugt. Statt in den einen Wert zu setzen soll sicher auch im Button1 ein neuer Waggon erzeugt werden.
|
AW: TString führt "pop" nicht aus
BTW:
![]() Zitat:
|
AW: TString führt "pop" nicht aus
Es lag anscheinend wirklich an dem felhenden T vor Waggon :wall:
Jetzt funktioniert alles. (und daran haben mein Lehrer und ich eine ganze Unterrichtseinheit verballert...) @ jaenicke Das ich die Änderung in meiner Listbox nicht sehen kann ist mir bewusst, dafür habe ich ja Button3 genutzt. Ich wollte erstmal den absoluten Grundsatz haben, das ganze Drumherum mit Schleifen, Ausgabe etc. kommt später. ;) @ HiWieGehts Der Name der Klasse ist relativ belanglos, die Aufgabenstellung sieht nur vor, dass sich Zahlen von StackA nach StackC bewegen, da fand ich Zug und Waggon ganz passend. Damit ist dann meine Frage beantwortet (ich weiß ja nicht ob ein Mod hier Threads schließen muss oder nicht) |
AW: TString führt "pop" nicht aus
Eines ist sicher, an dem T vor Waggon lag es nicht! Da hat sich sonst was verändert. Ob Waggon oder TWaggon ist grundsätzlich egal. Dabei handelt es sich nur um eine Definition, die dem Programmierer die Lesbarkeit des Codes vereinfachen soll. Für Delphi spielt das keine Rolle.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz