Einzelnen Beitrag anzeigen

GueAck

Registriert seit: 12. Jun 2009
10 Beiträge
 
Delphi 12 Athens
 
#1

Access violation bei Zugriff auf eine PUBLIC-Variable

  Alt 3. Dez 2024, 18:08
Delphi-Version: 5
Hallo,

ich habe in dem dargestellten Code eine Merkwürdigkeit: In der dargestellten Form läuft alles bestens. Wenn ich aber die Variable "Filename" in den PUBLIC-Teil verlege, dann wird die erste Datei richtig geöffnet und bearbeitet, aber beim öffnen der nächsten (!) Datei in "OpennextFil_der_Liste" gibt die Exception "Im Projekt Auflisten.exe ist eine Exception der Klasse $C0000005 mit der Meldung 'access violation at 0x0027a67e: read of address 0x3ca2427f'.". Im Aufruf-Stack der IDE (Delphi 12) steht als oberster Eintrag "@UStrAsG + $32".

Wenn ich auf die Zeile "Filename := f_Liste[..] einen Breakpoint setze, dann sehe ich beim ersten Aufruf, dass Filename ein leerer String ist, beim zweiten Auruf zeigt mir aber der Debugger an "Nicht verfügbarer Wert". Wie kann das sein?

Den Code habe ich vor vielen Jahren gemacht, vermutlich noch unter Delphi 7, da ist er (mit Filename im PUBLIC-Teil) sauber gelaufen.

Hat jemand eine Tdee, was die Ursache ist oder was ich falsch gemacht habe?

Grüße
GueAck

Delphi-Quellcode:
UNIT UfileListe;

INTERFACE
t_Urclass = CLASS
  PROCEDURE openfilefolge(vpfad: STRING); VIRTUAL; ABSTRACT;
  FUNCTION getzeile: boolean; VIRTUAL; ABSTRACT; {true: zeile vorhanden}
END;

t_fileListe = CLASS(t_Urclass)
  Filename: f_name; // in Public geht es nicht, das ergibt beim 2. Aufruf von opennextfild_der_luiste eine Access-violation UStrAsg
  PROCEDURE openfilefolge(vpfad: STRING); OVERRIDE;
  FUNCTION getzeile; OVERRIDE;
PRIVATE
  f_i, f_anz: integer; {Index des aktuellen Files in der f_liste }
  f_liste: ARRAY[1..fanzmax] OF STRING;
  FUNCTION opennextfile_der_liste: boolean; {True: Erfolg }
PUBLIC
  { Public-Deklarationen }
END;

IMPLEMENTATION

FUNCTION t_fileListe.getzeile;
VAR
  gefunden: boolean;
BEGIN
  // Liest alle Zeilen der aktuellen Datei ein.
  // Am Ende wird mit
  gelungen := opennextfile_der_liste;
  // die nächste Datei geöffnet.
  result := gelungen;
END;

FUNCTION t_fileArduino.opennextfile_der_liste;
BEGIN
  //...
  f_i := f_i + 1;
  Filename := f_liste[f_i]; // hier passiert der Fehler
  //...
END;

PROCEDURE t_fileArduino.openfilefolge(vpfad: STRING);
BEGIN
  // Die Nammen aller Dateien im Verzeichnis werden in die Liste f_liste eingetragen.
  f_i := 0;
  f_anz := Abzahl_der_vorhandenen_Dateien;
  opennextfile_der_luste;
END;

END.
  Mit Zitat antworten Zitat