![]() |
Zugriffsverletzung / EAccessViolation => Brauche Hilfe
Hi,
für einer meiner Programme habe ich bei einem OnClick folgenden Code:
Delphi-Quellcode:
Leider gibt es da ein großes Problem... Jedesmal, wenn die Prozedur fertig ist kommen tausende Zugriffsverletzungs-Meldungen ("EAccessViolation"). Mir ist das unverständlich... Kann mir jemand vielleicht helfen...
procedure TForm1.Button1Click(Sender: TObject);
var x, y, z, count: Integer; begin ResetPossible(); for y := 1 to 9 do for x := 1 to 9 do if StringGrid1.Cells[x-1, y-1] <> '' then begin Preset[x, y] := True; for z := 1 to 9 do Possible[x, y, z] := False; end else Preset[x, y] := False; for y := 1 to 9 do for x := 1 to 9 do if Preset[x, y] then ExcludeAll(x, y, StrToInt(StringGrid1.Cells[x-1, y-1])); for y := 1 to 9 do for x := 1 to 9 do if not Preset[x, y] then begin count := 0; for z := 1 to 9 do if Possible[x, y, z] then count := count + 1; if count = 1 then for z := 1 to 9 do if Possible[x, y, z] then StringGrid1.Cells[x-1, y-1] := IntToStr(z); end; end; Globale Variablen:
Delphi-Quellcode:
StringGrid1:
var
Possible: Array[1..9, 1..9, 1..9] of Boolean; Preset: Array[1..9, 1..9] of Boolean; => Hat immer 9 Spalten und 9 Reihen => Cells enthalten immer nur ein Integer Prozeduren: ResetPossible => Setzt alle Possible-Booleans auf True ExcludeAll => Auswertung des in der Tabelle vorkommenden Integers (In beiden Prozeduren kommt kein Fehler jemals vor) Ich habe überprüft wo genau der Fehler liegen könnte und bemerkt, dass es erst auftritt nachdem die gesamte Prozedur abgehandelt wurde... (Breakpoint auf den letzten 'end;' der Prozedur gesetzt => Bis dahin kein Fehler, danach ja). Außerdem: Der Fehler markiert immer das 'end.' nach 'Application.Run;' in der dpr Datei. Ich wäre für jede Hilfe äußerst dankbar... |
Re: Zugriffsverletzung / EAccessViolation => Brauche Hilf
Versuche doch einfach mal vorzeitig mit Exit aus der Prozedur rauszuspringen:
Delphi-Quellcode:
Wenn es keine Fehler gibt, wird die Exit Anweisung nach unten verschoben, bis der Fehler wieder auftritt.
procedure TForm1.Button1Click(Sender: TObject);
var x, y, z, count: Integer; begin Assert(Assigned(self)); // Sicherheits Check Assert(Assigned(StringGrid1)); // Sicherheits Check #2 ResetPossible(); Exit; // NUR ZUM TEST !!! for y := 1 to 9 do for x := 1 to 9 do ... So wird der Fehler eingegrenzt. |
Re: Zugriffsverletzung / EAccessViolation => Brauche Hilf
Hmmm... interessant. Wenn ich 'exit;' nach 'ResetPossible' setzte gibt es schon die Fehlermeldungen...
In meiner Prozedur 'ResetPossible' habe ich ein paar Variablen falsch eingesetzt :angel2: ; Die Zahlen waren so außerhalb des definierten Zählbereichs des Array, der da gesetzt wird :angel2: ; Danke für die Hilfe, shmia :thumb: :dp: |
Re: Zugriffsverletzung / EAccessViolation => Brauche Hilf
Ich rate dir dringends dazu in den Projektoptionen die Bereichsprüfung einzuschalten und das Projekt neu zu erstellen. Dann bekommst du bei einem solchen falschen Zugriff direkt den Fehler an der Stelle des Zugriff und bemerkst sowas deutlich früher. Dann können AV's dadurch nicht entstehen.
|
Re: Zugriffsverletzung / EAccessViolation => Brauche Hilf
Das mit der Bereichsprüfung habe ich noch nicht gewusst :thumb:
Die Hilfe sagt dazu: Zitat:
|
Re: Zugriffsverletzung / EAccessViolation => Brauche Hilf
Zitat:
|
Re: Zugriffsverletzung / EAccessViolation => Brauche Hilf
Ach so, dann wird das jetzt immer aktiviert ^^
|
Re: Zugriffsverletzung / EAccessViolation => Brauche Hilf
wie sieht ResetPossible() aus und warum verwendest du globale Variablen wenn du sie in der Klasse verwendest?
|
Re: Zugriffsverletzung / EAccessViolation => Brauche Hilf
Zitat:
Zitat:
Delphi-Quellcode:
Später:
procedure TForm1.ResetPossible();
var a, b, c: Integer; begin for a := 1 to 9 do for b := 1 to 9 do for c := 1 to 9 do Possible[a-1, b-1, c] := True; end;
Delphi-Quellcode:
Das Problem war, dass der StringGrid von 0 bis 8 und nicht von 1 bis 9 die Spalten und Zeilen abzählt... Ich hatte eigentlich Possible als Array[0..8, 0..8, 1..9] initialisiert, aber das war mir zu unübersichtlich. Als ich auf [0..9, 0..9, 0..9] umgestiegen bin, habe ich wohl nicht bemerkt, dass 'Possible[a-1, b-1, c] := True;' in der Prozedur 'ResetPossible()' nicht mehr immer gültig ist.
procedure TForm1.ResetPossible();
var a, b, c: Integer; begin for a := 1 to 9 do for b := 1 to 9 do for c := 1 to 9 do Possible[a, b, c] := True; end; Ich gestehe, dass das ein blöder Fehler ist und dass ich ihn eigentlich hätte entdecken können... Aber jetzt ist es repariert. Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:47 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