![]() |
Access violation bei dynamischen Arrays
Hi!
Ich hab ein Problem: Mein Delphi sagt Access violation bei 2 dynamischen Arrays. Mein Quelltext:
Delphi-Quellcode:
Ist da ein Fehler drinn?
var
sl: TStringList; FBild1, FBild2: Array of TColor; i1, i2: Integer; begin sl := TStringList.Create; sl.Add('*** Bild1 ***'); sl.Add(''); For i1 := 0 to Image1.Picture.Width do begin For i2 := 0 to Image1.Picture.Height do begin FBild1[Image1.Picture.Bitmap.Canvas.Pixels[i1,i2]] := FBild1[Image1.Picture.Bitmap.Canvas.Pixels[i1,i2]]+1; FBild2[Image2.Picture.Bitmap.Canvas.Pixels[i1,i2]] := FBild2[Image2.Picture.Bitmap.Canvas.Pixels[i1,i2]]+1; end; end; For i1 := Low(FBild1) to High(FBild1) do begin If FBild1[i1] <> 0 then sl.Add('Farbwert: '+IntToStr(i1)+'; Vorhanden: '+IntToStr(FBild1[i1])+'x'); end; sl.Add(''); sl.Add('*** Bild2 ***'); sl.Add(''); For i2 := Low(FBild2) to High(FBild2) do begin If FBild2[i2] <> 0 then sl.Add('Farbwert: '+IntToStr(i2)+'; Vorhanden: '+IntToStr(FBild2[i2])+'x'); end; ShowMessage(sl.GetText); sl.Free; Das Programm soll ausgeben, wieviel Farbwerte in 2 Bildern sind. Danke ;) |
AW: Access violation bei dynamischen Arrays
Wo tritt der Fehler auf?
|
AW: Access violation bei dynamischen Arrays
Wo ist denn das SetLength?
|
AW: Access violation bei dynamischen Arrays
@mkinzler: Der Fehler tritt bei "FBild1[Image1.Picture.Bitmap.Canvas.Pixels[i1,i2]] := FBild1[Image1.Picture.Bitmap.Canvas.Pixels[i1,i2]]+1;" auf.
@DeddyH: Muss es ein SetLength geben? und wenn ja - wo kann ich es einbauen? |
AW: Access violation bei dynamischen Arrays
Zitat:
Woher sollte Delphi sonst wissen, wie groß die Arrays sind ? Dazu solltest du deine Adressierung überdenken, so wie du es machst, brauchst du Array, die > 4 Milliarden Bytes groß sind Ich rate dir zu 2 TLists |
AW: Access violation bei dynamischen Arrays
Bei einem 32 Bit Bild bist du bei SetLength(FBild, 2^32). Da FBild eine Anzahl aufsummiert, muß dieses auch nicht vom Typ TColor sein. Und das ShowMessage(SL.GetText) durfte ungefair so groß werden wie deine Wohnzimmerwand. :-D
|
AW: Access violation bei dynamischen Arrays
Zitat:
|
AW: Access violation bei dynamischen Arrays
Da nur 24 Bit Farbtiefe unterstützt wird, sind es nur 16 Millionen Farben.
Das verkraftet der Speicher noch.
Delphi-Quellcode:
Bei einer Bildauflösung von 1024 * 768 können jetzt so bis ca. 700000 Zeilen im Dialog angezeigt werden ... :stupid:
// in den Arrays werden keine Farben gespeichert sondern Summen je Farbe
FBild1, FBild2: array of Integer; idx: Integer; // FBild1 initialisieren // BGR 3 Byte x 8 = 24 Bit = 16777216 verschiedene Summen SetLength(FBild1, 2 shl 24); // zufälligen Inhalt des Arrays mit 0 löschen FillChar(FBild1[0], SizeOf(FBild1[0]) * Length(FBild1), #0); // das ganze noch mal für FBild2 // Größe des Images nicht überschreiten ! for i1 := 0 to Image1.Picture.Height - 1 do begin for i2 := 0 to Image1.Picture.Width - 1 do begin // nur einmal auf Pixels zugreifen = doppelte Geschwindigkeit idx := Image1.Picture.Bitmap.Canvas.Pixels[i1,i2]; FBild1[idx] := FBild1[idx] + 1; // idx := Image2.Picture.Bitmap.Canvas.Pixels[i1,i2]; FBild2[idx] := FBild2[idx] + 1; end; end; // Stringlisten mit Summen für 16 Millionen Farben füllen ;) |
AW: Access violation bei dynamischen Arrays
Zitat:
Darum habe ich auch zu 2 TLists geraten |
AW: Access violation bei dynamischen Arrays
Erstmal Danke für die Antworten!
Ich probiere gerade die Möglichkeit von Blup aus ma gucken was draus wird ;) // Edit: Es hat funktioniert ;) Ich schreib die Farben aber jetzt in eine Datei sons wirds echt zu viel xD @Neutral General: Es soll bringen die Anzahl der Farben aus 2 Bildern iwo aufzuschreiben, danach sie zu vergleichen und danach auch bei kleinen unterschieden sie zu vergleichen. MFG |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:59 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