AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TString führt "pop" nicht aus

Offene Frage von "HiWieGehts"
Ein Thema von DerVicko · begonnen am 2. Jun 2013 · letzter Beitrag vom 2. Jun 2013
Antwort Antwort
DerVicko

Registriert seit: 2. Jun 2013
3 Beiträge
 
#1

TString führt "pop" nicht aus

  Alt 2. Jun 2013, 00:41
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.
  Mit Zitat antworten Zitat
DerVicko

Registriert seit: 2. Jun 2013
3 Beiträge
 
#2

AW: TString führt "pop" nicht aus

  Alt 2. Jun 2013, 00:44
Ups, es sollte natürlich heißen : "TStack führt pop nicht aus"

Geändert von DerVicko ( 2. Jun 2013 um 14:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.346 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: TString führt "pop" nicht aus

  Alt 2. Jun 2013, 07:02
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
HiWieGehts

Registriert seit: 19. Aug 2005
101 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: TString führt "pop" nicht aus

  Alt 2. Jun 2013, 07:39
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.
LG, HiWieGehts

Geändert von HiWieGehts ( 2. Jun 2013 um 07:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.346 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: TString führt "pop" nicht aus

  Alt 2. Jun 2013, 08:38
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: TString führt "pop" nicht aus

  Alt 2. Jun 2013, 08:40
BTW: TObject.Destroy
Zitat:
Rufen Sie Destroy nicht direkt auf. Verwenden Sie stattdessen Free. Die Methode Free überprüft, ob die Objekt-Referenz nicht bereits nil ist und ruft Destroy nur bei Bedarf auf.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
DerVicko

Registriert seit: 2. Jun 2013
3 Beiträge
 
#7

AW: TString führt "pop" nicht aus

  Alt 2. Jun 2013, 14:51
Es lag anscheinend wirklich an dem felhenden T vor Waggon
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)
  Mit Zitat antworten Zitat
HiWieGehts

Registriert seit: 19. Aug 2005
101 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: TString führt "pop" nicht aus

  Alt 2. Jun 2013, 21:07
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.
LG, HiWieGehts
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz