Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zugriffsverletzung bei Kompilierung (https://www.delphipraxis.net/99400-zugriffsverletzung-bei-kompilierung.html)

No0oB 11. Sep 2007 18:32


Zugriffsverletzung bei Kompilierung
 
Hallo Community.
Ich stehe gerade vor einem eigenartigen Problem und ich hoffe, dass ihr mir dabi weiterhelfen könnt.
Ich schreibe gerade ein Übungsprogramm für die Schule, wo OOP nähergebracht wird, an Beispiel eines Autos.
Alles klappt wunderbar, nun möchte ich ein Attribut "Log" füllen und da hängt es bei mir.
Ich werde die Codeschnipsel anhängen, jedoch werde ich das Problem beschreiben, bevor ich das mache.

Ich möchte in Prozeduren (auch im Konstruktor) auf eine Prozedur zugreifen, die mir einen Logeintrag erstellt.
Wenn ich dies mache, erhalte ich die Fehlermeldung
Zitat:

Zugriffsverletzung bei Addresse 00403F38 in Modul 'Auto.exe'. Schreiben von Addresse FFFFFFFC.
Ich nehme an, dass irgendwo ein Zugriff nicht erlaubt ist, obwohl mir das sehr eigenartig erscheint, da die Prozedur public ist.
Naja, ohne Code lässt sich nur herumraten, daher folgen hier die Codeschnipsel.

Das Programm besteht aus dem Formular und einer zusätzlichen Unit (uTAuto), welches die Autoklasse beinhaltet.
Hier sind also die Codeschnipsel (Ich habe das, was nicht zu dem Problem gehört, weggelassen):

Hier die Deklarationen
Code:
{  Define the type for returning arrays }
  type TStringArray = array of string;
  type TAuto = class
    private
      Log: TStringArray;
    public
      function getLog: TStringArray;
      procedure writeLogEntry(msg:string);
  end;
Hier die Funktion getLog
Code:
function TAuto.getLog: TStringArray;
  begin
    getLog := self.Log;
  end;
Zuletzt die Prozedur writeLogEntry
Code:
procedure TAuto.writeLogEntry(msg:string);
  var newKey: integer;
  begin
    newKey := High(self.Log);
    self.Log[newKey] := msg;
  end;
Ich hoffe mir kann jemand helfen,
Danke.

mirage228 11. Sep 2007 18:34

Re: Zugriffsverletzung bei Kompilierung
 
Du musst bei dynamischen Arrays die Länge vorher mit Setlength() festlegen (repsektive damit das Array bei bedarf vergrößern).

mfG
mirage228

No0oB 11. Sep 2007 18:58

Re: Zugriffsverletzung bei Kompilierung
 
Das heißt, dass ich im Konstruktor SetLength(0) schreibe und dann, in dem writeLogEntry jeweils das SetLength um 1 erhöhe ?

mirage228 11. Sep 2007 19:04

Re: Zugriffsverletzung bei Kompilierung
 
Zitat:

Zitat von No0oB
Das heißt, dass ich im Konstruktor SetLength(0) schreibe und dann, in dem writeLogEntry jeweils das SetLength um 1 erhöhe ?

Das SetLength(0) im Konstruktor ist überflüssig, reicht prinzipiell wenn Du das jeweils um 1 in writelogEntry erhöhst.

Was du aber noch verbessern könntest:
1.) Du könntest das Array immer in 5er (oder 6er oder wie auch immer) Schritten erhöhen (Du musst die Anzahl der Log-Einträge dazu aber manuell mitzählen, um dann wieder eröhen zu können) - das ist auf dauer Performanter
2.) Du verwendest statt einem dynamischen Array die Klasse Delphi-Referenz durchsuchenTStringList.

mfG
mirage228

No0oB 11. Sep 2007 19:24

Re: Zugriffsverletzung bei Kompilierung
 
Vielen Dank für deine Hilfe :)


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