Delphi-PRAXiS
Seite 1 von 3  1 23      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:05 Uhr.
Seite 1 von 3  1 23      

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