Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Debugging: Zugriffsverletzung, Prüfen ob Punkt im Dreieck (https://www.delphipraxis.net/135297-debugging-zugriffsverletzung-pruefen-ob-punkt-im-dreieck.html)

Shimau 8. Jun 2009 17:16


Debugging: Zugriffsverletzung, Prüfen ob Punkt im Dreieck
 
Wie gesagt ich bin beim Debuggen meines Progis und mich nervt so ne dumme 'Zugriffsverletzung bei Adresse 004034D3 ... Lesen von Adresse 0000BCF5'. Der Debugger stoppt hier:
Delphi-Quellcode:
program KunstmitdreiEcken;

uses
  Forms,
  Hauptanwendung in 'Hauptanwendung.pas' {Form1},
  Komponenten in 'Komponenten.pas';

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end. //<-- hier stoppt der Debugger
Der Fehler liegt aber natürlich ungefähr 300 Zeilen weiter und in ner anderen Unit ^^:
Ich hab den Fehler lokalisiert und es liegt höchstwahrscheinlich an dieser Prozedur, jedenfalls wird bei der zeilenweisen Ausführung immer da die Fehlermeldung ausgegeben:

Delphi-Quellcode:
procedure TForm1.Auswahl1;
var a,b,c,d:integer; //Zählvariablen
    Dreieck: TDreieck; //Prüfvariable
    moeglich:boolean; //Prüfvariable
begin
  moeglich:=true; //Anfangsdeklaration
  Dreieck:=Dreieck.Create;
  for a:=0 to Length(Punkte)-3 do // <-- ab hier kommt dann der Fehler
  begin
    for b:=a+1 to Length(Punkte)-2 do
    begin
        for c:=b+1 to Length(Punkte)-1 do
        begin
          Dreieck.a:=Punkte[a];
          Dreieck.b:=Punkte[b];
          Dreieck.c:=Punkte[c];
          for d:=a+1 to c-1 do
          begin
            if (Punkte[d].Y<Dreieck.mab*Punkte[d].X+Dreieck.nab) and (Punkte[d].Y<Dreieck.mac*Punkte[d].X+Dreieck.nac)
            and(Punkte[d].Y>Dreieck.mcb*Punkte[d].X+Dreieck.ncb) and (d<>a) and (d<>b) and (d<>c) //Punkt im Dreieck und nicht ein Punkt vom Dreieck
            then
            begin
              moeglich:=false; //nicht möglich
              Break;          //Schleife abbrechen
            end;
          end;
          if moeglich=true
          then
          begin
            SetLength(moglDE, Length(moglDE)+1); //1 neues Element hinzufügen
            moglDE[Length(moglDE)-1]:=moglDE[Length(moglDE)-1].Create;
            moglDE[Length(moglDE)-1]:=Dreieck; //Dreieck hinzufügen
          end
        end;
    end;
  end;
end;
Dazu ma ne kurze Erläuterung zur Klasse Dreieck:
Deklaration:

Delphi-Quellcode:
TDreieck = class
  public
    a:TPoint;
    b:TPoint;
    c:TPoint;
    function GetFA:real;
    function Getmab:real;
    function Getmac:real;
    function Getmcb:real;
    function Getnab:real;
    function Getnac:real;
    function Getncb:real;
    property FA:real read GetFA;
    property mab:real read Getmab;
    property mac:real read Getmac;
    property mcb:real read Getmcb;
    property nab:real read Getnab;
    property nac:real read Getnac;
    property ncb:real read Getncb;
  end;
mab, ... ist der Anstieg der Geradengleichung für die Gerade, wovon AB, ... eine Teilmenge ist
nab, ... ist der Versatz für Geradengleichung für die Gerade, wovon AB, ... eine Teilmenge ist

--> Geradengleichung in der Form f(x)=m*x+n

Ich habe keine Ahnung was der Debugger zu mäkeln hat, aber das Ergebniss gefällt mir ganz und gar nicht, denn ich habe keine Ausgabe und die Prozedur wird einfach abgebrochen.

Fussball-Robby 8. Jun 2009 17:22

Re: Debugging: Zugriffsverletzung, Prüfen ob Punkt im Dreiec
 
Ein einfacher kleiner Fehler. Klassen erstellt man so:ClassVar := ClassName.Create;. Bei Dreieck.Create (eine Zeile drüber) musst du also ein T ergänzen:
Delphi-Quellcode:
Dreieck := TDreieck.Create;
So sollte es gehen.

Uwe Raabe 8. Jun 2009 17:26

Re: Debugging: Zugriffsverletzung, Prüfen ob Punkt im Dreiec
 
... und ein paar Zeilen tiefer machst du einen ähnlichen Fehler:

Delphi-Quellcode:
           
SetLength(moglDE, Length(moglDE)+1); //1 neues Element hinzufügen
moglDE[Length(moglDE)-1] := Dreieck; //Dreieck hinzufügen
Dreieck := TDreieck.Create; // neues Dreieck für nächsten Durchlauf erzeugen
Im Anschluss an die Schleife sollte das aktuelle Dreieck dann auch wieder freigegeben werden:

Delphi-Quellcode:
  Dreieck.Free;

Shimau 8. Jun 2009 18:41

Re: Debugging: Zugriffsverletzung, Prüfen ob Punkt im Dreiec
 
Deswegen auch 2 Zugriffsverletzungen, naja bin halt mit der OOP noch nicht so vertraut.
Danke an euch beide.

Shimau 8. Jun 2009 19:19

Re: Debugging: Zugriffsverletzung, Prüfen ob Punkt im Dreiec
 
Mmh, Freude hat nicht lang angehalten: Nächste Zugriffsverletzung:

Delphi-Quellcode:
//Alle möglichn Kombinationen suchen
procedure TForm1.Auswahl2;
var n, i {Zählvariable}:integer;
    Bild:TBild; //Ablagerungsvariable
begin
  Bild:=TBild.Create;
  n:=Length(Punkte) div 3;    // 3n Punkte --> n Dreiecke pro Bild
  SetLength(Bilder,0);        //<-- daran glaub ich liegts, lösche ich da das Array?
  SetLength(Bild.Dreiecke,0);
  if n-1<Length(moglDE)-n
  then
  begin
    for i:=0 to n-1 do
    begin
      SetLength(Bilder,Length(Bilder)+1);
      Bild.Dreiecke[i]:=TDreieck.Create;
      Bild.Dreiecke[i]:=moglDE[i];
      Ausw2rek(Bild,i);
    end;
  end
  else
  begin
    for i:=0 to Length(moglDE)-n do
    begin
      SetLength(Bilder,Length(Bilder)+1);
      Bild.Dreiecke[0]:=TDreieck.Create;        // Deklaration stimmt jetzt oder?
      Bild.Dreiecke[0]:=moglDE[i];              //<-- hier
      Ausw2rek(Bild,i);
    end;
  end;
end;
Erläuterung:
Bilder :array of TBild
Bild:
Delphi-Quellcode:
TBild = class
  public
    Dreiecke:array of TDreieck;
    function GetAbwFA:real;
    function GetGesFA:real;
    function GetQualit(grAnt,gleich:boolean):real;
    property AbwFA:real read GetAbwFA;
    property GesFA:real read GetGesFA;
  end;

mkinzler 8. Jun 2009 19:21

Re: Debugging: Zugriffsverletzung, Prüfen ob Punkt im Dreiec
 
Zitat:

Delphi-Quellcode:
  SetLength(Bilder,0);        //<-- daran glaub ich liegts, lösche ich da das Array?

Jein, den Inhalt

Shimau 9. Jun 2009 14:17

Re: Debugging: Zugriffsverletzung, Prüfen ob Punkt im Dreiec
 
Zitat:

Zitat von mkinzler
Zitat:

Delphi-Quellcode:
  SetLength(Bilder,0);        //<-- daran glaub ich liegts, lösche ich da das Array?

Jein, den Inhalt

Na den Inhalt möcht ich ja löschen wenn ich nun
Delphi-Quellcode:
SetLength(Bilder,Length(Bilder)+1);
aufrufe, hat dann das Array den Index 0 oder fängt es dann mit Index 1 an?

mkinzler 9. Jun 2009 19:13

Re: Debugging: Zugriffsverletzung, Prüfen ob Punkt im Dreiec
 
Zitat:

hat dann das Array den Index 0 oder fängt es dann mit Index 1 an?
Ein dynamischer Array beginnt imm er mit dem Index 0

Shimau 10. Jun 2009 13:53

Re: Debugging: Zugriffsverletzung, Prüfen ob Punkt im Dreiec
 
Fehler gefunden und behoben, Progi funktioniert. Danke an die, die geholfen haben.


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