Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi "Objekt: Keller" geht nicht... (https://www.delphipraxis.net/103278-objekt-keller-geht-nicht.html)

ArchaicSeraphim 13. Nov 2007 17:46


"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:
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.
Ist da irgendwas GANZ falsch? Wäre sehr erfreut über Antwort! ^^

Dax 13. Nov 2007 17:49

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!

Klaus01 13. Nov 2007 17:50

Re: "Objekt: Keller" geht nicht...
 
Hast Du "m" irgendwo deklariert?

Grüße
Klaus

mkinzler 13. Nov 2007 17:51

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.

leddl 13. Nov 2007 17:54

Re: "Objekt: Keller" geht nicht...
 
Zitat:

Zitat von Klaus01
Hast Du "m" irgendwo deklariert?

Delphi-Quellcode:
procedure TKeller.push(m:string);
:zwinker:

Progman 13. Nov 2007 17:55

Re: "Objekt: Keller" geht nicht...
 
Ein Variablen-Name darf nie gleich dem Unit-Namen sein *mal anmerk* :)

ArchaicSeraphim 13. Nov 2007 17:56

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:
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.
Geht aber immer noch nicht. Wieso?

mkinzler 13. Nov 2007 17:57

Re: "Objekt: Keller" geht nicht...
 
Was für ein Fehler wird gemeldet?

ArchaicSeraphim 13. Nov 2007 17:58

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?

mkinzler 13. Nov 2007 18:00

Re: "Objekt: Keller" geht nicht...
 
Normalerweise steht vorher, genau welchen Fehler er anmahnt.

Progman 13. Nov 2007 18:00

Re: "Objekt: Keller" geht nicht...
 
nach interface eventuell noch nen uses-Block unterbringen?
Delphi-Quellcode:
uses Classes, Windows;
eventuell noch mehr, ich weiß jetzt nicht ausm Kopf, welche Units mind. notwendig sind.

marabu 13. Nov 2007 18:00

Re: "Objekt: Keller" geht nicht...
 
Besser so:

Delphi-Quellcode:
  TKeller = class
    FKeller: array of string;
    constructor create;
    procedure push(m:string);
    procedure pop;
    function top:string;
  end;
Grüße vom marabu

thkerkmann 13. Nov 2007 18:02

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

ArchaicSeraphim 13. Nov 2007 18:03

Re: "Objekt: Keller" geht nicht...
 
Delphi-Quellcode:
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.
So, jetzt geht's. Gracias!!! :party: :party: :party:

cruiser 13. Nov 2007 18:05

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.

thkerkmann 13. Nov 2007 18:06

Re: "Objekt: Keller" geht nicht...
 
Zitat:

n als globale Variable.. wird sicher lustig, wenn man zwei Instanzen der Klasse hat.. bau das mal lieber mit in die Klasse rein.
Genau, und im Create bei 0 starten lassen

ArchaicSeraphim 13. Nov 2007 18:45

Re: "Objekt: Keller" geht nicht...
 
Sorry, ist immer noch nicht fertig. Jetzt geht Folgendes nicht:

Delphi-Quellcode:
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.
Hat das was mit dem n zu tun? Und wie kann ich's so deichseln, dasses geht?
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;

mkinzler 13. Nov 2007 18:47

Re: "Objekt: Keller" geht nicht...
 
Was für ein Fehler meldet der Compiler?

ArchaicSeraphim 13. Nov 2007 18:48

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
---------------------------

mkinzler 13. Nov 2007 18:51

Re: "Objekt: Keller" geht nicht...
 
Du hast den Array als dynamischen array deklariert. Du musst ihn also dimensionieren (setLength())

DeddyH 13. Nov 2007 18:53

Re: "Objekt: Keller" geht nicht...
 
Wozu wird n eigentlich gebraucht?

ArchaicSeraphim 13. Nov 2007 18:56

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:
function TKeller.top:string;
begin
  if n>=1 then result := FKeller[n-1] // <<<<<< Ich hatte da nur n=1.
  else result := ' ';
end;
Thx!

mkinzler 13. Nov 2007 18:58

Re: "Objekt: Keller" geht nicht...
 
Der Array hat anfangs ß Einträge. Für jeden Eintrag, den du hinzufügst musst du zuerst Platz reservieren.

DeddyH 13. Nov 2007 18:59

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]

ArchaicSeraphim 13. Nov 2007 19:05

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 12:24 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