![]() |
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:
Der Fehler liegt aber natürlich ungefähr 300 Zeilen weiter und in ner anderen Unit ^^:
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 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:
Dazu ma ne kurze Erläuterung zur Klasse Dreieck:
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; Deklaration:
Delphi-Quellcode:
mab, ... ist der Anstieg der Geradengleichung für die Gerade, wovon AB, ... eine Teilmenge ist
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; 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. |
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:
So sollte es gehen.
Dreieck := TDreieck.Create;
|
Re: Debugging: Zugriffsverletzung, Prüfen ob Punkt im Dreiec
... und ein paar Zeilen tiefer machst du einen ähnlichen Fehler:
Delphi-Quellcode:
Im Anschluss an die Schleife sollte das aktuelle Dreieck dann auch wieder freigegeben werden: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
Delphi-Quellcode:
Dreieck.Free;
|
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. |
Re: Debugging: Zugriffsverletzung, Prüfen ob Punkt im Dreiec
Mmh, Freude hat nicht lang angehalten: Nächste Zugriffsverletzung:
Delphi-Quellcode:
Erläuterung:
//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; 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; |
Re: Debugging: Zugriffsverletzung, Prüfen ob Punkt im Dreiec
Zitat:
|
Re: Debugging: Zugriffsverletzung, Prüfen ob Punkt im Dreiec
Zitat:
Delphi-Quellcode:
aufrufe, hat dann das Array den Index 0 oder fängt es dann mit Index 1 an?
SetLength(Bilder,Length(Bilder)+1);
|
Re: Debugging: Zugriffsverletzung, Prüfen ob Punkt im Dreiec
Zitat:
|
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 20:49 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 by Thomas Breitkreuz