Einzelnen Beitrag anzeigen

Shimau

Registriert seit: 8. Jun 2009
Ort: Leipzig
14 Beiträge
 
Delphi 7 Personal
 
#1

Debugging: Zugriffsverletzung, Prüfen ob Punkt im Dreieck

  Alt 8. Jun 2009, 18:16
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.
  Mit Zitat antworten Zitat