AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Programmfehler: "Grafikalgorithmus"

Ein Thema von VkPenguin · begonnen am 11. Jul 2012 · letzter Beitrag vom 12. Jul 2012
Antwort Antwort
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#1

AW: Programmfehler: "Grafikalgorithmus"

  Alt 11. Jul 2012, 22:10
...starte kommt eine Exeptionmeldung während ich das Array befülle,
Welche denn?

Bereichsüberschreitung?
ggf. wäre der Sourcecode recht hilfreich bei der Fehlersuche.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
VkPenguin

Registriert seit: 23. Dez 2011
150 Beiträge
 
Delphi XE7 Architect
 
#2

AW: Programmfehler: "Grafikalgorithmus"

  Alt 11. Jul 2012, 22:20
Fehlermeldung: "Erste Gelegenheit für Exception bei $76C1B9BC. Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 00496FDD in Modul 'Bubbelzmain.exe'. Schreiben von Adresse 7EFB0000'. Prozess Bubbelzmain.exe (5128)"

Das Code normalerweise hilfreich ist dachte ich mir schon, nur weiß ich nicht, wie ich in diesem Falle geschickt passende Teile herausschneiden sollte. Ich könnte höchstens den vollständigen Code anbieten, aber dann ist es mühsam für euch, sich da erstmal einzulesen - mal abgesehen davon, dass er ja noch sehr frisch und unausgereift ist.

Bereichsüberschneidung kann ich mir, wenn ich dich richtig verstehe, nicht vorstellen, da es ja zwei getrennte Proceduren sind.

Danke aber für deine Antwort!
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.079 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Programmfehler: "Grafikalgorithmus"

  Alt 12. Jul 2012, 08:42
Bereichsüberschneidung kann ich mir, wenn ich dich richtig verstehe, nicht vorstellen, da es ja zwei getrennte Proceduren sind.
Obacht!
ÜberschREITung, nicht ÜberschNEIDung!

Gehe mal auf Menü > Projekt > Optionen > Delphi-Compiler > Compilieren > Optionen für Laufzeitfehler
Dort die drei Optionen E/A-Prüfung, Überlaufprüfung und Bereichsüberprüfung aktiv schalten.
  Mit Zitat antworten Zitat
VkPenguin

Registriert seit: 23. Dez 2011
150 Beiträge
 
Delphi XE7 Architect
 
#4

AW: Programmfehler: "Grafikalgorithmus"

  Alt 12. Jul 2012, 10:47
Ah, verlesen, Entschuldigung! Ich kenne die Optionen zwar nicht, du Du vorgeschlagen hast, aber ich erhalte immernoch dieselbe Fehlermeldung an derselben Stelle. Das Problem ist, dass ich mir das einfach nicht erklären kann und deshalb auch nicht weiß, wie ich weiter vorgehen soll
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.079 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Programmfehler: "Grafikalgorithmus"

  Alt 12. Jul 2012, 12:04
Ah, verlesen, Entschuldigung! Ich kenne die Optionen zwar nicht, du Du vorgeschlagen hast, aber ich erhalte immernoch dieselbe Fehlermeldung an derselben Stelle. Das Problem ist, dass ich mir das einfach nicht erklären kann und deshalb auch nicht weiß, wie ich weiter vorgehen soll
Ja nun, hast du denn die Optionen eingeschaltet?

Weiteres Vorgehen:
Den gesamten Quellcode posten.
Wir haben hier keine magische Glaskugel!
Entweder direkt oder als (ZIP-)Anhang.
  Mit Zitat antworten Zitat
VkPenguin

Registriert seit: 23. Dez 2011
150 Beiträge
 
Delphi XE7 Architect
 
#6

AW: Programmfehler: "Grafikalgorithmus"

  Alt 12. Jul 2012, 12:59
Klar, die Optionen hatte ich an, konnte aber wie gesagt nichts feststellen. Hier ist mal der Quellcode, ich bin aber leider wie gesagt noch nicht sonderlich gut
Danke für Eure Mühe!
Delphi-Quellcode:
unit Bubbelz;
{V.0.2}
{Einige Stellen sind noch umständlich/ungenau in der Berechnung}

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, jpeg, ExtDlgs, StdCtrls, PNGImage;

type Kreis = record
X:Integer;
Y:Integer;
Radius:Integer;
Farbe:Integer;
end;

type
  TForm1 = class(TForm)
    Hauptbild: TImage;
    PIC_Load: TOpenPictureDialog;
    BT_PIC_Load: TButton;
    BT_Start: TButton;
    BT_Save: TButton;
    procedure FormCreate(Sender: TObject);
    procedure BT_PIC_LoadClick(Sender: TObject);
    procedure HauptbildClick(Sender: TObject);
    procedure AnalysePIC;
    procedure Progress(X:Integer;Y:Integer);
    function KleinstAbstandZuLinie(X:Integer;Y:Integer):Integer;
    function KleinstAbstandZuLinie2(X:Integer;Y:Integer):Integer;
    function AbstandZuPunkt(X1:Integer;Y1:Integer;X2:Integer;Y2:Integer):Integer;
    procedure BT_StartClick(Sender: TObject);
    procedure BT_SaveClick(Sender: TObject);
  private
    { Private-Deklarationen }

   Var PIc_res:Tbitmap;
   VAR PIC_RES2:TJpegImage;
   Var PIC:String ;
   VAR Maxentf:Real;
   Var PIC_Breite,PIC_Höhe,LinePTK,Kreisanzahl,Standartwahrscheinlichkeit,MaxRadius:Integer;
   VAR Line:Array[0..1600,0..1200] of Boolean;
       AbstLine:Array[0..1600,0..1200] of Integer;
       Kreise:Array[1..500000] of Kreis;
       KreisPTK:Array[0..1600,0..1200] of Boolean;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BT_PIC_LoadClick(Sender: TObject);
begin
Pic_Load.Execute();
PIC:=Pic_Load.FileName;
Hauptbild.Picture.LoadFromFile(PIC);
PIC_Res2.LoadFromFile(PIC);
PIC_Breite:=PIc_res2.Width;
PIC_Höhe:=PIC_res2.Height;
end;

function TForm1.AbstandZuPunkt(X1:Integer;Y1:Integer;X2:Integer;Y2:Integer):Integer;
Var Dx,Dy:Integer;
begin
Dx:=abs(X1-X2);
Dy:=abs(Y1-Y2);
result:=round(sqrt((Dy*Dy)+(Dx*Dx)));
end;

function TForm1.kleinstAbstandZuLinie(X:Integer;Y:Integer):Integer;
Var Kleinst,I,J,Abstand:Integer;
Begin
{//Zu umständlich//
Kleinst:=10000;
for I  := 0 to PIC_Breite do
Begin
for J  := 0 to PIC_Höhe do
Begin
if Line[I,J] then
Begin
Abstand:=AbstandzuPunkt(X,Y,I,J);
if Abstand<=Kleinst then Kleinst:=Abstand;
End;
End;
End;  }

End;

function TForm1.kleinstAbstandZuLinie2(X:Integer;Y:Integer):Integer;
Var I,J,Abstand,Zähler:Integer;
Begin
Abstand:=0;
if Line[X,Y] then result:=0
else
Begin
while Abstand=0 do
Begin
Zähler:=Zähler+1;
for I:=X-Zähler To X+Zähler Do if Line[I,Y-Zähler] then Abstand:=AbstandzuPunkt(X,Y,I,Y-Zähler);
for I:=X-Zähler To X+Zähler Do if Line[I,Y+Zähler] then Abstand:=AbstandzuPunkt(X,Y,I,Y+Zähler);
for I:=Y-Zähler To Y+Zähler Do if Line[X+Zähler,I] then Abstand:=AbstandzuPunkt(X,Y,X+Zähler,I);
for I:=Y-Zähler To Y+Zähler Do if Line[X-Zähler,I] then Abstand:=AbstandzuPunkt(X,Y,X-Zähler,I);
End;
End;
result:=Abstand;
End;

Procedure TForm1.Progress(X:Integer;Y:Integer);
VAR Abst,Radius:Integer;
P:Real;
begin
P:=(Random(100)+1)*(MaxEntf/(AbstLine[X,Y]*10));
if P<=Standartwahrscheinlichkeit then
Begin
//KREIS
Radius:=(Random(MaxRadius*100) div 100); //Nicht gewichtet
Kreisanzahl:=Kreisanzahl+1;
Kreise[Kreisanzahl].X:=X;
Kreise[Kreisanzahl].Y:=Y;
Kreise[Kreisanzahl].Radius:=Radius;
End;

end;





procedure TForm1.BT_SaveClick(Sender: TObject);
VAR Save:TJpegImage;
begin
Save:=TJpegimage.create;
Save.Assign(Hauptbild.Picture.Bitmap);
Save.SaveToFile('C:\Users\Felix\Desktop\Ergebnis.jpg');
end;

procedure TForm1.BT_StartClick(Sender: TObject);
var x,y,kleinst,m,k,größterAbstand:Integer;
begin
GrößterAbstand:=0;
AnalysePIC; //1.
for X := 0 to PIC_Breite do
Begin
for Y := 0 to PIC_Höhe do
Begin
if Line[X,Y] then AbstLine[X,Y]:=0
else
Begin
AbstLine[X,Y]:=kleinstAbstandzuLinie2(X,Y);
if (AbstLine[X,Y]>GrößterAbstand) then GrößterAbstand:=AbstLine[X,Y];
END;
End;
End;

For m:=1 to GrößterAbstand Do
Begin
for X := 0 to PIC_Breite do
Begin
for Y := 0 to PIC_Höhe do
Begin
if (AbstLine[X,Y]=M) then
Begin
Progress(X,Y);
End;
End;
End;
End;

for X := 0 to PIC_Breite do
Begin
for Y := 0 to PIC_Höhe do
Begin
Hauptbild.Canvas.Pixels[X,Y]:=clWhite;
End;
End;

for X:=1 To Kreisanzahl Do Hauptbild.Canvas.Ellipse(Kreise[X].X,Kreise[X].Y,Kreise[X].X+Kreise[X].Radius,Kreise[X].Y+Kreise[X].Radius);

end;

procedure TForm1.AnalysePIC;
VAR I,J:Integer;
begin
for I := 0 to PIC_Breite do
Begin
for J := 0 to PIC_Höhe do
Begin
Line[I,J]:=False;
End;
End;

PIC_res.Assign(PIc_res2);

for I := 0 to PIC_Breite do
Begin
for J := 0 to PIC_Höhe do
Begin
if Pic_Res.Canvas.Pixels[I,J] = clBlack then
Begin
Line[I,J]:=True;
LinePTK:=LinePTK+1;
End
else Pic_res.Canvas.Pixels[I,J]:=clWhite;
End;
End;
Hauptbild.Picture.Assign(Pic_res);
MaxEntf:=sqrt(PIC_Breite*PIC_Breite+PIC_Höhe*PIC_Höhe);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
MaxRadius:=PIC_Breite div 20;
Standartwahrscheinlichkeit:=90; //90%
PIC_Höhe:=1200;
PIC_Breite:=1600;
Form1.Top:=0;
Form1.Left:=0;
form1.width := screen.width;
form1.height := screen.height;
PIc_Res:=Tbitmap.Create;
PIC_res2:=TjpegImage.create;
end;

procedure TForm1.HauptbildClick(Sender: TObject);
begin
Pic_Load.Execute();
PIC:=Pic_Load.FileName;
Hauptbild.Picture.LoadFromFile(PIC);
PIC_Res2.LoadFromFile(PIC);
PIC_Breite:=PIc_res2.Width;
PIC_Höhe:=PIC_res2.Height;

end;

end.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

AW: Programmfehler: "Grafikalgorithmus"

  Alt 12. Jul 2012, 13:07
Variable Zähler in function TForm1.kleinstAbstandZuLinie2 ist vor dem 1. Zugriff undefiniert.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.666 Beiträge
 
Delphi 12 Athens
 
#8

AW: Programmfehler: "Grafikalgorithmus"

  Alt 12. Jul 2012, 13:08
In kleinstAbstandZuLinie2 ist Zähler nicht initialisiert, d.h. da steht irgendeine Zahl drin. Und Du solltest Dir dringend eine nachvollziehbare Einrückung angewöhnen, der Code ist sehr schlecht zu lesen. Übrigens musst Du Objekte, die Du zur Laufzeit erzeugst, auch wieder freigeben (das JPEGImage beim Speichern z.B.).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 01:48 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-2025 by Thomas Breitkreuz