Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Access violation bei dynamischen Arrays (https://www.delphipraxis.net/161033-access-violation-bei-dynamischen-arrays.html)

Destroyer446 13. Jun 2011 15:16

Access violation bei dynamischen Arrays
 
Hi!
Ich hab ein Problem: Mein Delphi sagt Access violation bei 2 dynamischen Arrays.
Mein Quelltext:
Delphi-Quellcode:
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;
Ist da ein Fehler drinn?
Das Programm soll ausgeben, wieviel Farbwerte in 2 Bildern sind.

Danke ;)

mkinzler 13. Jun 2011 15:20

AW: Access violation bei dynamischen Arrays
 
Wo tritt der Fehler auf?

DeddyH 13. Jun 2011 15:23

AW: Access violation bei dynamischen Arrays
 
Wo ist denn das SetLength?

Destroyer446 13. Jun 2011 17:50

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?

guinnes 13. Jun 2011 18:00

AW: Access violation bei dynamischen Arrays
 
Zitat:

Zitat von Destroyer446 (Beitrag 1106178)
@DeddyH: Muss es ein SetLength geben? und wenn ja - wo kann ich es einbauen?

Bevor du deine Arrays benutzt. Und es muß nicht nur eines, sondern 2 geben ( je eines für jedes Array )
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

Bjoerk 13. Jun 2011 23:41

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

Neutral General 14. Jun 2011 08:26

AW: Access violation bei dynamischen Arrays
 
Zitat:

Zitat von Bjoerk (Beitrag 1106220)
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

Ich bin mir insgesamt noch nicht 100%ig sicher was das alles bringen soll, aber SetLength(FBild, 2^32) ist Schwachsinn. Wenn schon, dann Länge*Breite*(SizeOf(TColor) = 4)

Blup 14. Jun 2011 09:32

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:
// 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 ;)
Bei einer Bildauflösung von 1024 * 768 können jetzt so bis ca. 700000 Zeilen im Dialog angezeigt werden ... :stupid:

guinnes 14. Jun 2011 09:34

AW: Access violation bei dynamischen Arrays
 
Zitat:

Zitat von Neutral General (Beitrag 1106229)
Ich bin mir insgesamt noch nicht 100%ig sicher was das alles bringen soll, aber SetLength(FBild, 2^32) ist Schwachsinn. Wenn schon, dann Länge*Breite*(SizeOf(TColor) = 4)

Der TE möchte die Anzahl der Farben im Bild zählen, also muß das Array für jede mögliche Farbe einen Platz haben. Also 2^32 wäre schon richtig.
Darum habe ich auch zu 2 TLists geraten

Destroyer446 14. Jun 2011 10:00

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.
Seite 1 von 2  1 2      

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