Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zugriffsverletzung / EAccessViolation => Brauche Hilfe (https://www.delphipraxis.net/106351-zugriffsverletzung-eaccessviolation-%3D-brauche-hilfe.html)

qb-tim 9. Jan 2008 16:07


Zugriffsverletzung / EAccessViolation => Brauche Hilfe
 
Hi,

für einer meiner Programme habe ich bei einem OnClick folgenden Code:

Delphi-Quellcode:
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;
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...

Globale Variablen:
Delphi-Quellcode:
var
  Possible: Array[1..9, 1..9, 1..9] of Boolean;
  Preset: Array[1..9, 1..9] of Boolean;
StringGrid1:
=> 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...

shmia 9. Jan 2008 16:29

Re: Zugriffsverletzung / EAccessViolation => Brauche Hilf
 
Versuche doch einfach mal vorzeitig mit Exit aus der Prozedur rauszuspringen:
Delphi-Quellcode:
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
       ...
Wenn es keine Fehler gibt, wird die Exit Anweisung nach unten verschoben, bis der Fehler wieder auftritt.
So wird der Fehler eingegrenzt.

qb-tim 10. Jan 2008 08:24

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:

Muetze1 10. Jan 2008 08:38

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.

Aurelius 10. Jan 2008 08:43

Re: Zugriffsverletzung / EAccessViolation => Brauche Hilf
 
Das mit der Bereichsprüfung habe ich noch nicht gewusst :thumb:

Die Hilfe sagt dazu:
Zitat:

Die Aktivierung der Bereichsprüfung vergrößert und verlangsamt Ihr Programm.
Wirkt sich das sehr stark aus?

sirius 10. Jan 2008 08:45

Re: Zugriffsverletzung / EAccessViolation => Brauche Hilf
 
Zitat:

Zitat von xX0815Xx
Das mit der Bereichsprüfung habe ich noch nicht gewusst :thumb:

Die Hilfe sagt dazu:
Zitat:

Die Aktivierung der Bereichsprüfung vergrößert und verlangsamt Ihr Programm.
Wirkt sich das sehr stark aus?

Das machst du ja nur zum Debuggen und schaltest es später wieder ab.

Aurelius 10. Jan 2008 08:48

Re: Zugriffsverletzung / EAccessViolation => Brauche Hilf
 
Ach so, dann wird das jetzt immer aktiviert ^^

SirThornberry 10. Jan 2008 09:32

Re: Zugriffsverletzung / EAccessViolation => Brauche Hilf
 
wie sieht ResetPossible() aus und warum verwendest du globale Variablen wenn du sie in der Klasse verwendest?

qb-tim 11. Jan 2008 08:55

Re: Zugriffsverletzung / EAccessViolation => Brauche Hilf
 
Zitat:

Zitat von SirThornberry
warum verwendest du globale Variablen wenn du sie in der Klasse verwendest?

Andere Knöpfe - Andere Prozeduren... Einige Sachen meines Programms laufen nicht immer in Form1 ab :wink:

Zitat:

Zitat von SirThornberry
wie sieht ResetPossible() aus?

Vorhin:

Delphi-Quellcode:
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;
Später:

Delphi-Quellcode:
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;
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.

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:

Zitat von xX0815Xx
Das mit der Bereichsprüfung habe ich noch nicht gewusst :thumb:

Ich auch nicht... Es hilft aber sehr. Danke, Muetze1 :cheers:


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