![]() |
Re: anfänger: stack als klasse erstellen
Delphi-Quellcode:
Du solltest dir die Pascal Naming-Conventions angewöhnen:
type
Tzeiger = ^Tinfo;
Delphi-Quellcode:
PZeiger = ^TInfo;
Delphi-Quellcode:
Eigentlich sollte er hier schon beim var streiken.
var first : Tzeiger; //Zeiger auf das erste Element im STack
Delphi-Quellcode:
FFirst: PInfo;
Delphi-Quellcode:
Erstens greifst du hier auf eine Variable Stack zu, ganz pöse und auch unsinnig. Zweitens weist du FFirst gleich danach nil zu, also spar dir doch das Erstellen.
constructor Tstack.create();
begin inherited; new(stack.first); first:=nil; end; Ergo: Bis jetzt kannst du den Konstruktor einfach weglassen.
Delphi-Quellcode:
else result:='Kein Element im Stack';
![]()
Delphi-Quellcode:
Den Rest kann ich mir leider nicht mehr anschauen, Simpsons rufen ;) .
stack := TStack.Create;
|
Re: anfänger: stack als klasse erstellen
naja gut, die bezeichnung werd ich dann noch ändern.
Delphi-Quellcode:
die variable "first" brauche ich aber in jedem fall, sie zeigt immer auf das erste element im stack.
Tstack = class(Tobject)
... ... private var first : Tzeiger; //Zeiger auf das erste Element im Stack end; wie bzw. wo könnte ich sie denn besser deklarieren?
Delphi-Quellcode:
mit dem constructor habe ich das so verstanden, dass er speicherplatz für ein element reserviert.
constructor Tstack.create();
begin inherited; stack:=stack.create; first:=nil; end; jetzt weiß ich aber auch nicht genau. :| mit
Delphi-Quellcode:
wird ja eigentlich auch schon der speicherplatz für die variable stack reserviert oder?
var stack : Tstack
wozu dann extra das "constructor"? könnte man nicht immer einfach "procedure" nehmen?
Delphi-Quellcode:
: ein neuer stack hat noch kein element, deshalb habe ich "first" auf nil gesetzt.
first:=nil;
|
Re: anfänger: stack als klasse erstellen
Instanzvariablen werden automatisch auf 0 initialisiert. also eine referenz ist automatisch nil.
|
Re: anfänger: stack als klasse erstellen
also so wie es aussieht ist der constructor dann wirklich überflüssig.
bleibt noch die frage wo ich das
Delphi-Quellcode:
innerhalb der klasse deklarieren soll.
var first : Tzeiger; //Zeiger auf das erste Element im Stack
|
Re: anfänger: stack als klasse erstellen
Mach aus dem
Delphi-Quellcode:
mal ein
type
Tzeiger = ^Tinfo;
Delphi-Quellcode:
Dann weiß jeder sofort was gemeint ist: T->Klasse, P: Zeiger (Pointer) ;)
type
PInfo = ^TInfo; Und das first-Element gehört in den private-Teil, allerdings musst du das var davor weglassen. |
Re: anfänger: stack als klasse erstellen
Liste der Anhänge anzeigen (Anzahl: 1)
hab jetzt alles so gemacht
Delphi-Quellcode:
anbei die ganze testumgebung.
type
Pinfo = ^Tinfo; Tinfo = Record info : String; next : Pinfo; End; Tstack = class(Tobject) //constructor create; procedure pop; //Element vom Stack runterschmiessen, OHNE es zurückzuliefern! procedure push(info : String); //Element draufpacken function empty : Boolean; //Ist der Stack leer? function GetFirstItem : String; //Liefert das erste Element vom Stack zurück destructor destroy; private first : Pinfo; //Zeiger auf das erste Element im Stack end; var Form1: TForm1; var st : Tstack; implementation {$R *.dfm} {constructor Tstack.create(); begin inherited; //new(stack.first); //first:=nil; end; ist anscheinend überflüssig } procedure Tstack.pop; var help : Pinfo; begin if not (first = nil) then begin help:=first; first:=first^.next; dispose(help); end; end; procedure Tstack.push(info : String); var help : Pinfo; begin new(help); help^.info:=info; help^.next:=nil; if (first=nil) then first^:=help^ else begin help.next:=first; first:=help; end; end; function Tstack.empty : Boolean; begin result:=(First=nil); end; function Tstack.GetFirstItem : String; begin if not (first=nil) then result:=first^.info else result:='Kein Element im Stack'; end; destructor Tstack.destroy; begin inherited; end; procedure TForm1.createClick(Sender: TObject); begin //st.create; end; procedure TForm1.pushClick(Sender: TObject); begin st.push(edit1.text); end; procedure TForm1.popClick(Sender: TObject); begin st.pop; end; bekomme immernoch einen fehler (zugrissverletzung) beim "pushen" in der zeile:
Delphi-Quellcode:
if (first=nil) then first^:=help^
|
Re: anfänger: stack als klasse erstellen
Delphi-Quellcode:
begin
if (first=nil) then first := help else begin help.next:=first; first:=help; end; end;
Delphi-Quellcode:
procedure TForm1.createClick(Sender: TObject);
begin st := TStack.Create; end; |
Re: anfänger: stack als klasse erstellen
Hallo,
einige Anmerkungen:
|
Re: anfänger: stack als klasse erstellen
Liste der Anhänge anzeigen (Anzahl: 1)
habe das programm soweit verbessert, zumindest kommen jetzt keine abstürze mehr.
allerdings ist wohl irgendwo ein fehler in der push oder pop procedure. ich kann elemente in den stack packen und er zeigt mir auch immer das oberste elemente mit "getfirstitem", aber wenn ich einmal die pop procedure ausführe wird nur noch (meine exception) angezeigt "Keine Elemente im Stack". hab jetzt schon ne ganze zeit lang geguckt, finde den fehler aber nicht :|
Delphi-Quellcode:
type
Pinfo = ^Tinfo; Tinfo = Record info : String; next : Pinfo; End; Tstack = class(Tobject) constructor create; procedure pop; //Element vom Stack runterschmiessen, OHNE es zurückzuliefern! procedure push(info : String); //Element draufpacken function empty : Boolean; //Ist der Stack leer? function GetFirstItem : String; //Liefert das erste Element vom Stack zurück destructor destroy; private first : Pinfo; //Zeiger auf das erste Element im Stack end; var Form1: TForm1; var st : Tstack; implementation {$R *.dfm} constructor Tstack.create; begin inherited; end; procedure Tstack.pop; var help : Pinfo; begin if not empty then begin help:=first; first:=first^.next; dispose(help); end; end; procedure Tstack.push(info : String); var help : Pinfo; begin new(help); help^.info:=info; help^.next:=nil; if not empty then first:=help else begin help.next:=first; first:=help; end; end; function Tstack.empty : Boolean; begin result:=(First=nil); end; function Tstack.GetFirstItem : String; begin if not empty then result:=first^.info else result:='Kein Element im Stack'; end; destructor Tstack.destroy; begin inherited; //fehlt noch: nacheinander alle stackelemente "disposen" end; procedure TForm1.createClick(Sender: TObject); begin st := TStack.Create; end; procedure TForm1.pushClick(Sender: TObject); begin st.push(edit1.text); end; procedure TForm1.popClick(Sender: TObject); begin st.pop; end; procedure TForm1.Oberstes_ItemClick(Sender: TObject); begin showmessage(st.GetFirstItem); end; |
Re: anfänger: stack als klasse erstellen
Der Fehler steckt in der Methode push:
Delphi-Quellcode:
Wenn du dir die Routine nach der Korrektur etwas genauer ansiehst, wirst du sie sicher vereinfachen können...
if empty then first := help // so sollte es aussehen!
Gruß Hawkeye |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:45 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