![]() |
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. |
AW: Kellerspeicher
Und welcher Fehler wird gemeldet? Übrigens:
Zitat:
Delphi-Quellcode:
heißen. Und weshalb Du hier auf die benannte Form-Instanz zugreifst, wo Du doch extra Parameter deklariert hast, wirst wohl nur Du wissen:
procedure TForm1.FormCreate(Sender: TObject);
begin fstack := TStack.create; end; Zitat:
|
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:
Genauere Fehlerbeschreibungen sind schon eine tolle Angelegenheit. [/edit] Nur...
Delphi-Quellcode:
Wieso kennt dein Stack die Form?
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; 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. |
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. |
AW: Kellerspeicher
Zitat:
Ist das semantisch nicht korrekt ? |
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:
|
AW: Kellerspeicher
Ich dachte mir eigentlich dabei , dass der Benutzer i selber aussuchen kann , indem er das ins Edit-Feld reinschreibt.
|
AW: Kellerspeicher
Was glaubst Du, was mit der lokalen Variablen geschieht, wenn Du aus der Methode wieder rauskommst?
|
AW: Kellerspeicher
Stimmt , also liegt die Empfehlung hier , das global zu deklarieren ?
|
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 09:19 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