AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Debugging: Zugriffsverletzung, Prüfen ob Punkt im Dreieck
Thema durchsuchen
Ansicht
Themen-Optionen

Debugging: Zugriffsverletzung, Prüfen ob Punkt im Dreieck

Ein Thema von Shimau · begonnen am 8. Jun 2009 · letzter Beitrag vom 10. Jun 2009
Antwort Antwort
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
Benutzerbild von Fussball-Robby
Fussball-Robby

Registriert seit: 22. Okt 2007
Ort: Nähe Köln
1.063 Beiträge
 
Delphi 7 Enterprise
 
#2

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

  Alt 8. Jun 2009, 18:22
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:Dreieck := TDreieck.Create; So sollte es gehen.
Robert L.
Der folgende Satz ist richtig!
Der vorherige Satz ist falsch!

Paradox
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 8. Jun 2009, 18:26
... 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:

  Dreieck.Free;
Uwe Raabe
  Mit Zitat antworten Zitat
Shimau

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

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

  Alt 8. Jun 2009, 19:41
Deswegen auch 2 Zugriffsverletzungen, naja bin halt mit der OOP noch nicht so vertraut.
Danke an euch beide.
  Mit Zitat antworten Zitat
Shimau

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

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

  Alt 8. Jun 2009, 20:19
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;
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#6

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

  Alt 8. Jun 2009, 20:21
Zitat:
  SetLength(Bilder,0); //<-- daran glaub ich liegts, lösche ich da das Array?
Jein, den Inhalt
Markus Kinzler
  Mit Zitat antworten Zitat
Shimau

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

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

  Alt 9. Jun 2009, 15:17
Zitat von mkinzler:
Zitat:
  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
SetLength(Bilder,Length(Bilder)+1); aufrufe, hat dann das Array den Index 0 oder fängt es dann mit Index 1 an?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#8

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

  Alt 9. Jun 2009, 20:13
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
Markus Kinzler
  Mit Zitat antworten Zitat
Shimau

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

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

  Alt 10. Jun 2009, 14:53
Fehler gefunden und behoben, Progi funktioniert. Danke an die, die geholfen haben.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:48 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