![]() |
Programmfehler: "Grafikalgorithmus"
Guten Abend zusammen,
ich habe nocheinmal eine Frage zu einem Programm. Ich arbeite nun seit kurzen an einem Programm, dass etwa folgendes tun soll: 1. Man läd ein beliebiges Bild (.jpg zum Beispiel) 2. Nun wählt man eine bestimmte Farbe aus (z.B. Schwarz) 3. Das Programm entfernt alle Farben außer Schwarz, sodass es nurnoch Schwarz und Weiß gibt 4. Das Programm ersetzt das sich daraus ergebende Bild nun durch viele Kreise, die nach einen bestimmten Muster ausgewählt werden Ziel soll es also sein, z.B. aus einem Bild mit einem Viereck ein Muster aus Kreisen zu machen, dem man den Ursprung aber noch ansehen kann. -> Je kleiner der Abstand eines Punktes auf dem Bild zu einem Schwarzen Punkt, desto höher ist die Wahrscheinlichkeit, dass ein Kreis erstellt wird -> Je kleiner der Abstand eines Punktes auf dem Bild zu einem Schwarzen Punkt, desto kleiner ist der Kreis wahrscheinlich Ich bin ein recht unerfahrener Programmierer und das Programm ist auch noch nicht fertig, daher ist es nicht wunderlich, dass noch nicht alles funktioniert, aber ich habe einen Fehler, den ich mir einfach nicht erklären kann: - Wenn ich das Programm mit einem eher großen Testbild starte kommt eine Exeptionmeldung während ich das Array befülle, in dem die Daten der Kreise (Position, Farbe, Radius) gespeichert werden - Ich dachte mir, der Fehler entsteht vielleicht, weil das Array zu klein ist, also vergrößerte ich es, dann erhalte ich aber eine Fehlermeldung in einer Procedur, die NUR FRÜHER im Programm aufgerufen wird und NICHT mit dem Array in Verbindung steht. Wie kann das sein? :?: Wie gesagt, ich bin mir zwar bewusst das noch einige Fehler in dem Programm stecken, aber das ist doch eigentlich unmöglich....? Vielen lieben Dank für eure Tipps! |
AW: Programmfehler: "Grafikalgorithmus"
Zitat:
Bereichsüberschreitung? ggf. wäre der Sourcecode recht hilfreich bei der Fehlersuche. Gruß K-H |
AW: Programmfehler: "Grafikalgorithmus"
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! |
AW: Programmfehler: "Grafikalgorithmus"
Zitat:
Ü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. |
AW: Programmfehler: "Grafikalgorithmus"
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
|
AW: Programmfehler: "Grafikalgorithmus"
Zitat:
Weiteres Vorgehen: Den gesamten Quellcode posten. Wir haben hier keine magische Glaskugel! Entweder direkt oder als (ZIP-)Anhang. |
AW: Programmfehler: "Grafikalgorithmus"
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. |
AW: Programmfehler: "Grafikalgorithmus"
Variable
Delphi-Quellcode:
in
Zähler
Delphi-Quellcode:
ist vor dem 1. Zugriff undefiniert.
function TForm1.kleinstAbstandZuLinie2
|
AW: Programmfehler: "Grafikalgorithmus"
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.).
|
AW: Programmfehler: "Grafikalgorithmus"
Ah, vielen lieben Dank für eure Tipps, das werd ich gleich mal berichtigen. So einen Fehler hatte ich voher schonmal, das finde ich irgendwie sehr gewöhnungsbedürftig.. Das diese Codeeinrückung Sinn macht sehe ich ja ein, gibt es irgendwo festgelegte Regeln, die man nachlesen kann, damit es möglichst einheitlich ist?
*EDIT* Jetzt habe ich diesen Fehler - Erste Gelegenheit für Exception bei $7580B9BC. Exception-Klasse ERangeError mit Meldung 'Fehler bei Bereichsprüfung'. Prozess Bubbelzmain.exe (5772) - in der ersten For-Schleife nach
Delphi-Quellcode:
Aber wenn ich mir im Objektinspektor die Werte von den Variablen ansehen will um nachzusehen wo das Problem liegt, sind die Variablen nicht verfügbar. Gibt es da vielleicht einen Trick?
Zähler:=Zähler+1;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:18 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