![]() |
"Objekt: Keller" geht nicht...
Hi Leutz,
Ich bin grade dabei, mir einen Keller zu bauen, aber aus irgendeinem Grund kann "die Unit Keller.pas nicht compiliert werden." Kann mir mal wer sagen, wieso? Hier ist sie:
Delphi-Quellcode:
Ist da irgendwas GANZ falsch? Wäre sehr erfreut über Antwort! ^^
unit Keller;
interface type TKeller = class constructor create; procedure push(m:string); procedure pop; function top:(top:string); end; var Keller: array of char; n: integer; implementation constructor TKeller.create; begin inherited create; n:=1; end; procedure TKeller.push(m:string); begin inc(n); setlength(Keller,n); Keller[n-1] := m; end; procedure TKeller.pop; begin dec(n); setlength(Keller,n); end; function top:(top:string); begin top := Keller[n-1]; end; end. |
Re: "Objekt: Keller" geht nicht...
Delphi-Quellcode:
type
TKeller = class constructor create; procedure push(m:string); procedure pop; function:top:string; end; // <-- das muss hin! |
Re: "Objekt: Keller" geht nicht...
Hast Du "m" irgendwo deklariert?
Grüße Klaus |
Re: "Objekt: Keller" geht nicht...
Weil dein Quellcode mehrere Fehler enthält:
Delphi-Quellcode:
unit Keller;
interface type TKeller = class constructor create; procedure push(m:string); procedure pop; function top:string; Keller: array of char; end; var n: integer; oKeller: TKeller; implementation constructor TKeller.create; begin inherited create; n:=1; end; procedure TKeller.push(m:string); begin inc(n); setlength(Keller,n); Keller[n-1] := m; end; procedure TKeller.pop; begin dec(n); setlength(Keller,n); end; function TKeller.Top:string; begin result := Keller[n-1]; end; end. |
Re: "Objekt: Keller" geht nicht...
Zitat:
Delphi-Quellcode:
:zwinker:
procedure TKeller.push(m:string);
|
Re: "Objekt: Keller" geht nicht...
Ein Variablen-Name darf nie gleich dem Unit-Namen sein *mal anmerk* :)
|
Re: "Objekt: Keller" geht nicht...
Hoi,
"m" ist bei mir doch in der procedure. Sonst nirgendwo. Und das "end;" habe ich auch gesetzt. Hilft nicht. Pls hlp!! edit: Hab's jetzt so gemacht:
Delphi-Quellcode:
Geht aber immer noch nicht. Wieso?
unit Keller;
interface type TKeller = class constructor create; procedure push(m:string); procedure pop; function top:string; Keller: array of Char; end; var n: integer; oKeller: TKeller; implementation constructor TKeller.create; begin inherited create; n:=1; end; procedure TKeller.push(m:string); begin inc(n); setlength(Keller,n); Keller[n-1] := m; end; procedure TKeller.pop; begin dec(n); setlength(Keller,n); end; function TKeller.top:string; begin result := Keller[n-1]; end; end. |
Re: "Objekt: Keller" geht nicht...
Was für ein Fehler wird gemeldet?
|
Re: "Objekt: Keller" geht nicht...
Hab' jetzt das array umbenannt zu "K". Hilft nix. Fehler:
[Fataler Fehler] Test.pas(7): Verwendete Unit 'Keller.pas' kann nicht compiliert werden (Also in ner anderen Unit.) Help! What heißt das? |
Re: "Objekt: Keller" geht nicht...
Normalerweise steht vorher, genau welchen Fehler er anmahnt.
|
Re: "Objekt: Keller" geht nicht...
nach interface eventuell noch nen uses-Block unterbringen?
Delphi-Quellcode:
eventuell noch mehr, ich weiß jetzt nicht ausm Kopf, welche Units mind. notwendig sind.
uses Classes, Windows;
|
Re: "Objekt: Keller" geht nicht...
Besser so:
Delphi-Quellcode:
Grüße vom marabu
TKeller = class
FKeller: array of string; constructor create; procedure push(m:string); procedure pop; function top:string; end; |
Re: "Objekt: Keller" geht nicht...
Hi,
sollte die Membervariable Keller nicht lieber vom Typ Array of string sein ? Du willst doch Strings speichern. Nur mal so... [Edit] hrr, marabu war schneller [/Edit] Gruss |
Re: "Objekt: Keller" geht nicht...
Delphi-Quellcode:
So, jetzt geht's. Gracias!!! :party: :party: :party:
unit Keller;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TKeller = class FKeller: array of string; constructor create; procedure push(m:string); procedure pop; function top:string; end; var n: integer; oKeller: TKeller; implementation constructor TKeller.create; begin inherited create; n:=1; end; procedure TKeller.push(m:string); begin inc(n); setlength(FKeller,n); FKeller[n-1] := m; end; procedure TKeller.pop; begin dec(n); setlength(FKeller,n); end; function TKeller.top:string; begin result := FKeller[n-1]; end; end. |
Re: "Objekt: Keller" geht nicht...
n als globale Variable.. wird sicher lustig, wenn man zwei Instanzen der Klasse hat.. bau das mal lieber mit in die Klasse rein.
|
Re: "Objekt: Keller" geht nicht...
Zitat:
|
Re: "Objekt: Keller" geht nicht...
Sorry, ist immer noch nicht fertig. Jetzt geht Folgendes nicht:
Delphi-Quellcode:
Hat das was mit dem n zu tun? Und wie kann ich's so deichseln, dasses geht?
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Keller, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Button1: TButton; Button3: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; Keller: TKeller; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin Keller:=TKeller.create end; procedure TForm1.Button1Click(Sender: TObject); begin Keller.push('m'); Label1.Caption:=Keller.top; end; procedure TForm1.Button2Click(Sender: TObject); begin Keller.push('X'); Label1.Caption:=Keller.top; end; procedure TForm1.Button3Click(Sender: TObject); begin Keller.pop; Label1.Caption:=Keller.top; end; end. Danke schonmal jedenfalls. €dit: bei 0 starten lassen kann ich nicht wegen
Delphi-Quellcode:
constructor TKeller.create;
begin inherited create; n:=1; FKeller[n-1] := 's'; // <<<< undefiniert bei n=0, oder? end; |
Re: "Objekt: Keller" geht nicht...
Was für ein Fehler meldet der Compiler?
|
Re: "Objekt: Keller" geht nicht...
Fehler:
--------------------------- Benachrichtigung über Debugger-Exception --------------------------- Im Projekt Project1.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 00403E8C in Modul 'Project1.exe'. Schreiben von Adresse 00000000'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen. --------------------------- OK Hilfe --------------------------- |
Re: "Objekt: Keller" geht nicht...
Du hast den Array als dynamischen array deklariert. Du musst ihn also dimensionieren (setLength())
|
Re: "Objekt: Keller" geht nicht...
Wozu wird n eigentlich gebraucht?
|
Re: "Objekt: Keller" geht nicht...
n soll in der ganzen KellerUnit die Größe des KellerArrays festlegen. Klar soweit?
Und die length habe ich doch gesettet, oder? Klärt mich auf wenn nicht wo nicht! €dit: Hab's gerafft, sorry Leutz. War aber nicht nur das, sondern auch
Delphi-Quellcode:
Thx!
function TKeller.top:string;
begin if n>=1 then result := FKeller[n-1] // <<<<<< Ich hatte da nur n=1. else result := ' '; end; |
Re: "Objekt: Keller" geht nicht...
Der Array hat anfangs ß Einträge. Für jeden Eintrag, den du hinzufügst musst du zuerst Platz reservieren.
|
Re: "Objekt: Keller" geht nicht...
Das ist IMHO überflüssig. Wenn Du initial mit SetLength(FKeller,0) das Array leer anlegst, kannst Du im Weiteren immer Length(FKeller) bemühen, um es neu zu dimensionieren.
[edit] Sry, mkinzler, das bezog sich auf #22 [/edit] |
Re: "Objekt: Keller" geht nicht...
Jo, man kann in der Tat alle "n"s durch "length(FKeller)"s ersetzen. Hab' ich mal gemacht ^^ Danke, danke!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:07 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