AGB  ·  Datenschutz  ·  Impressum  







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

anfänger: stack als klasse erstellen

Ein Thema von nkaaa · begonnen am 9. Mai 2006 · letzter Beitrag vom 10. Mai 2006
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#11

Re: anfänger: stack als klasse erstellen

  Alt 10. Mai 2006, 18:30
Delphi-Quellcode:
type
  Tzeiger = ^Tinfo;
Du solltest dir die Pascal Naming-Conventions angewöhnen:
PZeiger = ^TInfo;       var first : Tzeiger; //Zeiger auf das erste Element im STack Eigentlich sollte er hier schon beim var streiken.
FFirst: PInfo;
Delphi-Quellcode:
constructor Tstack.create();
begin
  inherited;
  new(stack.first);
  first:=nil;
end;
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.
Ergo: Bis jetzt kannst du den Konstruktor einfach weglassen.

else result:='Kein Element im Stack'; Delphi-Referenz durchsuchenExceptions

  stack := TStack.Create; Den Rest kann ich mir leider nicht mehr anschauen, Simpsons rufen .
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
nkaaa

Registriert seit: 25. Feb 2006
28 Beiträge
 
Delphi 2005 Personal
 
#12

Re: anfänger: stack als klasse erstellen

  Alt 10. Mai 2006, 18:55
naja gut, die bezeichnung werd ich dann noch ändern.

Delphi-Quellcode:
  Tstack = class(Tobject)
    ...
    ...
    private
      var first : Tzeiger; //Zeiger auf das erste Element im Stack
  end;
die variable "first" brauche ich aber in jedem fall, sie zeigt immer auf das erste element im stack.
wie bzw. wo könnte ich sie denn besser deklarieren?


Delphi-Quellcode:
constructor Tstack.create();
begin
  inherited;
  stack:=stack.create;
  first:=nil;
end;
mit dem constructor habe ich das so verstanden, dass er speicherplatz für ein element reserviert.
jetzt weiß ich aber auch nicht genau.
mit var stack : Tstack wird ja eigentlich auch schon der speicherplatz für die variable stack reserviert oder?
wozu dann extra das "constructor"? könnte man nicht immer einfach "procedure" nehmen?


first:=nil; : ein neuer stack hat noch kein element, deshalb habe ich "first" auf nil gesetzt.
  Mit Zitat antworten Zitat
Benutzerbild von phXql
phXql

Registriert seit: 11. Mär 2004
Ort: Mühldorf
824 Beiträge
 
#13

Re: anfänger: stack als klasse erstellen

  Alt 10. Mai 2006, 19:31
Instanzvariablen werden automatisch auf 0 initialisiert. also eine referenz ist automatisch nil.
"Dunkel die andere Seite ist"
"Yoda! Halts Maul und iss deinen Toast!"
  Mit Zitat antworten Zitat
nkaaa

Registriert seit: 25. Feb 2006
28 Beiträge
 
Delphi 2005 Personal
 
#14

Re: anfänger: stack als klasse erstellen

  Alt 10. Mai 2006, 19:46
also so wie es aussieht ist der constructor dann wirklich überflüssig.

bleibt noch die frage wo ich das
var first : Tzeiger; //Zeiger auf das erste Element im Stack innerhalb der klasse deklarieren soll.
  Mit Zitat antworten Zitat
Benutzerbild von Ultimator
Ultimator

Registriert seit: 17. Feb 2004
Ort: Coburg
1.860 Beiträge
 
FreePascal / Lazarus
 
#15

Re: anfänger: stack als klasse erstellen

  Alt 10. Mai 2006, 19:51
Mach aus dem
Delphi-Quellcode:
type
  Tzeiger = ^Tinfo;
mal ein
Delphi-Quellcode:
type
  PInfo = ^TInfo;
Dann weiß jeder sofort was gemeint ist: T->Klasse, P: Zeiger (Pointer)

Und das first-Element gehört in den private-Teil, allerdings musst du das var davor weglassen.
Julian J. Pracht
  Mit Zitat antworten Zitat
nkaaa

Registriert seit: 25. Feb 2006
28 Beiträge
 
Delphi 2005 Personal
 
#16

Re: anfänger: stack als klasse erstellen

  Alt 10. Mai 2006, 20:22
hab jetzt alles so gemacht
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;
  //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;
anbei die ganze testumgebung.
bekomme immernoch einen fehler (zugrissverletzung)
beim "pushen" in der zeile:   if (first=nil) then first^:=help^
Angehängte Dateien
Dateityp: rar stack_als_klasse_290.rar (182,3 KB, 3x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#17

Re: anfänger: stack als klasse erstellen

  Alt 10. Mai 2006, 20:28
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;
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#18

Re: anfänger: stack als klasse erstellen

  Alt 10. Mai 2006, 20:38
Hallo,

einige Anmerkungen:
  • Den Destruktor Destroy solltest du mit OVERRIDE kennzeichnen, da du ihn überschreibst:

    destructor Destroy; override;
  • In der Implementierung des Destruktors solltest du alle noch enthaltenen Elemente wieder freigeben.
  • Vor dem Beenden des Programms (z.B. in FormDestroy) solltest du die Instanz (Variable st) wieder freigeben.
  • Warum nutzt die Methode empty nicht in den anderen Methoden? Stattdessen überprüfst du die Variable First immer direkt auf den Wert NIL.
Gruß Hawkeye
  Mit Zitat antworten Zitat
nkaaa

Registriert seit: 25. Feb 2006
28 Beiträge
 
Delphi 2005 Personal
 
#19

Re: anfänger: stack als klasse erstellen

  Alt 10. Mai 2006, 21:10
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;
Angehängte Dateien
Dateityp: rar stack_als_klasse_123.rar (193,3 KB, 2x aufgerufen)
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#20

Re: anfänger: stack als klasse erstellen

  Alt 10. Mai 2006, 21:18
Der Fehler steckt in der Methode push:

if empty then first := help // so sollte es aussehen! Wenn du dir die Routine nach der Korrektur etwas genauer ansiehst, wirst du sie sicher vereinfachen können...

Gruß Hawkeye
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 22:17 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