Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Kellerspeicher (https://www.delphipraxis.net/168475-kellerspeicher.html)

hotkey 23. Mai 2012 16:46

Kellerspeicher
 
Hallo , ich schreibe morgen endlich die Informatik-LK-Klausur und habe als Übung mal einen Kellerspeicher programmiert , kp , ob es richtig oder falsch ist.

Auf jeden Fall compiliert er alles , aber leider kriege ich noch einen Fehler , der das Compilieren eigentlich behindert.

Hier der Code:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;


  type
   Tperson = record
    name : string;
    id:integer;
    end;


    TStack = class
     private
       Keller : array[1..4] of Tperson;
        Stackpos : Integer;
       public
       procedure stackpush(i:integer;s:string);
       function stackpop():integer;
       function stacktop():integer;
       constructor create;
       end;



  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private

    { Private declarations }
    FStack : Tstack;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;


implementation

{$R *.dfm}

constructor tstack.create;
 begin
   Stackpos := -1;       // HIER WIRD ES ALS FEHLER MARKIERT ; WAS IST HIER FALSCH ?
   end;



procedure tstack.stackpush(i:integer;s:string);
 begin
   inc(stackpos);
   i := strtoint(form1.Edit1.Text);
   s := form1.edit2.text;
   Keller[Stackpos].id := i;
   Keller[Stackpos].name := s;
   end;


function tstack.stackpop:integer;
 begin
   result := Keller[Stackpos].id;
   dec(stackpos);
   end;


  function tstack.stacktop:integer;
   begin
     result := Keller[Stackpos].id;
     end;






procedure TForm1.Button1Click(Sender: TObject);
var myrec : Tperson;
begin
myrec.name := form1.edit1.text;
myrec.id := strtoint(form1.edit2.text);
fstack.stackpush(strtoint(form1.Edit1.text),'form1.edit2.text');

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
fstack.stacktop;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
fstack.create;

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
fstack.Free;
end;

end.

DeddyH 23. Mai 2012 16:59

AW: Kellerspeicher
 
Und welcher Fehler wird gemeldet? Übrigens:
Zitat:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
fstack.create;

end;

Das sollte wohl
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  fstack := TStack.create;
end;
heißen. Und weshalb Du hier auf die benannte Form-Instanz zugreifst, wo Du doch extra Parameter deklariert hast, wirst wohl nur Du wissen:
Zitat:

Delphi-Quellcode:
procedure tstack.stackpush(i:integer;s:string);
 begin
   inc(stackpos);
   //die beiden folgenden Zeilen sind doch eigentlich kompletter Unsinn
   i := strtoint(form1.Edit1.Text);
   s := form1.edit2.text;
   Keller[Stackpos].id := i;
   Keller[Stackpos].name := s;
   end;


himitsu 23. Mai 2012 16:59

AW: Kellerspeicher
 
Und wie lautet die Fehlermeldung?
PS: Strg+C Funktioniert an vielen Stellen (Inhalte von Fehlerdialogen und auch unten die markierten Compilermeldungen)

Aber eigentlich sieht es OK aus.


[edit]
Etwa Zugriffsverletzung bei Adresse 000000xx?
Tja, das liegt an deinem falschen Create-Aufruf.

Zitat:

Auf jeden Fall compiliert er alles , aber leider kriege ich noch einen Fehler , der das Compilieren eigentlich behindert.
Nja, ich hatte dich so verstanden das der Compiler meckert.
Genauere Fehlerbeschreibungen sind schon eine tolle Angelegenheit.
[/edit]


Nur...
Delphi-Quellcode:
procedure tstack.stackpush(i:integer;s:string);
 begin
   inc(stackpos);
   i := strtoint(form1.Edit1.Text);
   s := form1.edit2.text;
   Keller[Stackpos].id := i;
   Keller[Stackpos].name := s;
 end;
Wieso kennt dein Stack die Form?
Und wozu die Parameter, wenn du es dann sowieso ignorierst und dir selbst holst? (bzw. warum selbst holen, wenn man es bekommt? :zwinker: )


[add]
PS: Wenn du Variablen ala Form1 verwenden mußt, dann machst du zu 99% ganz bestimmt was falsch.

hotkey 23. Mai 2012 17:05

AW: Kellerspeicher
 
Vielen Dank für die Antworten , jetzt compiliert er :

Habs auch ein bisschen verändert. Ist es jetzt bisschen besser :D ?

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;


  type
   Tperson = record
    name : string;
    id:integer;
    end;


    TStack = class
     private
       Keller : array[1..4] of Tperson;
        Stackpos : Integer;
        i:integer;
       public
       procedure stackpush;
       function stackpop():integer;
       function stacktop():integer;
       constructor create;
       end;



  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private

    { Private declarations }
    FStack : Tstack;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;


implementation

{$R *.dfm}

constructor tstack.create;
 begin
   Stackpos := -1;
   end;



procedure tstack.stackpush;
 begin
   inc(stackpos);
   Keller[Stackpos].id := i;
   end;


function tstack.stackpop:integer;
 begin
   result := Keller[Stackpos].id;
   dec(stackpos);
   end;


  function tstack.stacktop:integer;
   begin
     result := Keller[Stackpos].id;
     end;






procedure TForm1.Button1Click(Sender: TObject);
var myrec : Tperson;
begin
myrec.name := form1.edit1.text;
myrec.id := strtoint(form1.edit2.text);
fstack.stackpush;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
fstack.stacktop;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
fstack := tstack.create;

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
fstack.Free;
end;

end.

hotkey 23. Mai 2012 17:07

AW: Kellerspeicher
 
Zitat:

Zitat von himitsu (Beitrag 1167744)


[add]
PS: Wenn du Variablen ala Form1 verwenden mußt, dann machst du zu 99% ganz bestimmt was falsch.

Was meinst du damit ?

Ist das semantisch nicht korrekt ?

DeddyH 23. Mai 2012 17:10

AW: Kellerspeicher
 
Deine TForm1-Instanz muss ja nicht zwangsläufig Form1 heißen. Lass den Namen einfach weg, dann wird das automatisch zu self, greift also auf die eigene Instanz zu.
Zitat:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var myrec : Tperson;
begin
myrec.name := {form1.}edit1.text;
myrec.id := strtoint({form1.}edit2.text);
fstack.stackpush;

end;

Aber wieso hast Du nun die Parameter bei stackpush rausgeworfen? Welchen Wert soll i denn haben?

hotkey 23. Mai 2012 17:13

AW: Kellerspeicher
 
Ich dachte mir eigentlich dabei , dass der Benutzer i selber aussuchen kann , indem er das ins Edit-Feld reinschreibt.

DeddyH 23. Mai 2012 17:17

AW: Kellerspeicher
 
Was glaubst Du, was mit der lokalen Variablen geschieht, wenn Du aus der Methode wieder rauskommst?

hotkey 23. Mai 2012 17:18

AW: Kellerspeicher
 
Stimmt , also liegt die Empfehlung hier , das global zu deklarieren ?

DeddyH 23. Mai 2012 17:24

AW: Kellerspeicher
 
Nimm doch einfach die Parameter wieder rein und weise innerhalb der stackpush-Methode deren Werte dem aktuellen Record zu.

hotkey 23. Mai 2012 17:30

AW: Kellerspeicher
 
Also so hier : ?

Delphi-Quellcode:
procedure tstack.stackpush(i:integer;s:string);
 begin
   inc(stackpos);
   Keller[Stackpos].id := i;
   Keller[Stackpos].Name := s;
   end;
Und da muss ich doch wieder sagen , dass der Benutzer das eingeben soll.

Wenn ich die Prozedur aufrufe , was soll ich dann in den Kopf reinschreiben , damit er weiß , dass i gleich strtoint(edit1.text) ist ?

DeddyH 23. Mai 2012 17:33

AW: Kellerspeicher
 
Was würdest Du hiervon halten?
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  FStack.stackpush(StrToInt(Edit2.Text), Edit1.Text);
end;

hotkey 23. Mai 2012 17:35

AW: Kellerspeicher
 
So ähnlich hatte ich es auch am Anfang , ich hatte bloß Hochkommata.

Alles klar vielen Dank , davon halte ich sehr viel.

Ich glaube , dass ich gut gerüstet bin für die Klausur , auch dank deiner Hilfe.

Vielen Vielen Dank , wir sehen uns hoffentlich bei anderen Problemen <3.

DeddyH 23. Mai 2012 17:38

AW: Kellerspeicher
 
Dann drücken wir mal die Daumen :)

himitsu 23. Mai 2012 17:42

AW: Kellerspeicher
 
Zitat:

Zitat von hotkey (Beitrag 1167750)
Ist das semantisch nicht korrekt ?

Njain, also korrekt ist es sogesehn schon,
aber würdest du solche Globalen nicht verwenden, dann währe dir z.B. aufgefallen, daß du in TStack auf die Form zugreifst, anstatt die Parameter zu nutzen. :zwinker:

Wenn man alle Daten korrekt übergibt, dann kommt man meistens ohne solche globalen Variablen aus. :angle:

PS: Eine Prüfung auf die Arraygrenzen fehlt noch.
Oder notfalls einfach die Compileroption für Indexprüfung aktivieren. (Projektoptionen > Bereichsprüfung)

hotkey 23. Mai 2012 17:46

AW: Kellerspeicher
 
Das werde ich in der Klausur machen , das mit der Bereichsprüfung :D

Vielen vielen Dank !

DeddyH 23. Mai 2012 17:47

AW: Kellerspeicher
 
Man müsste ja nur in stackpush schauen, ob sich stackpos überhaupt noch erhöhen lässt oder man schon am array-ende steht.

himitsu 23. Mai 2012 17:50

AW: Kellerspeicher
 
Du kannst auch mehr rausholen, als drinnen ist. :zwinker:

DeddyH 23. Mai 2012 17:52

AW: Kellerspeicher
 
Nur das da dann mit größter Wahrscheinlichkeit Müll rauskommt.

Namenloser 23. Mai 2012 17:57

AW: Kellerspeicher
 
Eigentlich wurde alles schon gesagt, aber ich wollte noch ergänzen, dass Delphi auch von Haus aus eine Stack-Implementierung an Bord hat. Sie befindet sich in der Unit contnrs und heißt Delphi-Referenz durchsuchenTStack. Kannst du dir ja mal anschauen, wenn dich interessiert, wie Borland es implementiert hat ;)

Voraussetzung ist natürlich, dass du hast eine Delphi-Version hast, bei der der Source-Code dabei ist (z.B. Turbo-Delphi)...

Achja, und du solltest deinen Code konsequenter einrücken.

hotkey 23. Mai 2012 17:59

AW: Kellerspeicher
 
Alles klar , danke für deinen Tipp dicka.


Werde ich mir mal anschauen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08: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