Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi bitmap in array einlesen -> zugriffverletzung (https://www.delphipraxis.net/113163-bitmap-array-einlesen-zugriffverletzung.html)

griever 3. Mai 2008 19:14


bitmap in array einlesen -> zugriffverletzung
 
hi
ich bin am verzweifeln denn ich bekomm immerwieder zugriffverletzungen wenn ich an der stelle bin
Delphi-Quellcode:
vy:=pic^.Height;
vx:=pic^.width;
for y := 0 to vy - 1 do
begin
  p := pic^.ScanLine[y];
  for x := 0 to vx - 1 do
  begin
    zray[x,y] := p^;
    inc(p);
  end;
end;
durch die breakpoints konnt ich den fehler auf die zeile zray[x,y] := p^; begrenzen nur weis ich nich was bei der zuweisung von im prinzip gleicher variablen zu einer zugriffverletzung führen kann
merkwürdigerweise kommt die fehlermeldung nur, wenn ich am anfang dem bild (pic^) eine größe (mit width und height) zuweise
allerdings hab ich ohne diese zuweisung überhaupt kein bild
weis jmd zufällig wo die zugriffvverletzung herrührt?
hier noch die typen/variablen
Delphi-Quellcode:
var
Zray:picarray;
p:^rgbtriple;
pic:ptobitmap;
vx,vy:integer;
type
ptobitmap = ^Tbitmap;
picarray= array of array of rgbtriple;

Apollonius 3. Mai 2008 19:18

Re: bitmap in array einlesen -> zugriffverletzung
 
Hast du überhaupt mit SetLength die Array-Größe gesetzt?

olee 3. Mai 2008 19:20

Re: bitmap in array einlesen -> zugriffverletzung
 
Setz mal an die Zeile

zray[x,y] := p^;

einen Breakpoint und markier "p^"

Nun mach einen Rechtsklick und klick auf "Ausdruck am Cursor..."

da musst du dann vllt. nochmal p^ eingeben und auf auswerten klicken.

Probier das mal!

SirThornberry 3. Mai 2008 19:24

Re: bitmap in array einlesen -> zugriffverletzung
 
was um himmelswillen ist das und was bezweckst du damit?
Delphi-Quellcode:
pic: ptobitmap;
[...]
ptobitmap = ^Tbitmap;

griever 4. Mai 2008 00:57

Re: bitmap in array einlesen -> zugriffverletzung
 
Zitat:

Zitat von SirThornberry
was um himmelswillen ist das und was bezweckst du damit?

also da ^Tbitmap nicht direkt als übergabe parameter einer funktion ging hab ich die klasse selbst definiert ... merkwürdigerweise ist anscheind ^tbitmap nicht gleich ptobitmap zumindest wenn mans
Delphi-Quellcode:
constructor Thidethread.create(PtoBit: Ptobitmap; text: PAnsiString);
darein schreibt
wenn ich nur das normale Tbitmap übergebe kopiert er das und verändert die kopie und ich komm an diese dann nur noch übern umweg ran ich wollte halt direkt auf das selbe bitmap zeichnen.(man muss vlt noch dazusagen das thidethread der thread ist in dem auch der fehler sich befindet)gibts da etwa ne bessere lösung für?

@olee was soll da passieren? hab ne englische version weist du wie das dort heißt? ich habs jetzt in die watch list aufgenommen und die werte dadrinn sind 255,255,255 für r,g,b

Muetze1 4. Mai 2008 01:08

Re: bitmap in array einlesen -> zugriffverletzung
 
Zitat:

Zitat von griever
wenn ich nur das normale Tbitmap übergebe kopiert er das und verändert die kopie und ich komm an diese dann nur noch übern umweg ran ich wollte halt direkt auf das selbe bitmap zeichnen.

Seit wann denn dieses? Delphi hat keine Copy Constructoren und somit wird hier definitiv kein Bitmap kopiert.

Auch ist der Zeiger auf ein TBitmap an sich unsinnig, da Referenzen intern Zeiger sind. Somit baust du dir einen Zeiger auf einen Zeiger - und das willst du definitiv nicht. Von daher die Frage was du damit bezwecken willst.

Zitat:

Zitat von griever
(man muss vlt noch dazusagen das thidethread der thread ist in dem auch der fehler sich befindet)gibts da etwa ne bessere lösung für?

TBitmap braucht Handles für den Canvas, Pen, Brush, Font, etc. Diese werden z.T. durch die VCL intern selbst verwaltet und ist dieser Teil ist nicht threadsafe. Wenn du als ein TBitmap in einem Thread nutzen willst, dann lege die Instanz ausserhalb an und nutze das Bitmap so lange nicht mehr ausserhalb, so lange du es im Thread nutzt.

griever 4. Mai 2008 08:38

Re: bitmap in array einlesen -> zugriffverletzung
 
@mutzl wenn ich das bitmap innerhalb des threads verwenden will, muss ich doch die im constructor übergebene variable an eine threadinterne variable weitergeben
Delphi-Quellcode:
constructor Thidethread.create(PtoBit: Ptobitmap; text: PAnsiString);
begin
pic := PtoBit;
end;
und da würde er mir doch nur den inhalt des ptobit bitmaps in das pic bitmap schreiben oder nicht?
aber da du grad von handle sprichst das übergeben des handles würde wohl nicht gehen oder?
jedenfalls wird das bitmap im hauptthread erzeugt und im contructor übergeben

im übrigen muss ich noch asche auf mein haut streuen
mit setlength(zray,x,y) kommt nun keine zugriffverletzung mehr
diese möglichkeit hatte ich schon ganz vergessen, da bei den anderen array die ich so ausprobiert hab genau diese zeile zu einer zugriffverletzung geführt hat.
von daher noch ein dickes Danke an euch...
wer allerdings noch nett wenn mir jmd sagt was eine alternative zu meinem ^Tbitmap wäre?

Muetze1 4. Mai 2008 14:46

Re: bitmap in array einlesen -> zugriffverletzung
 
Zitat:

Zitat von griever
@mutzl wenn ich das bitmap innerhalb des threads verwenden will, muss ich doch die im constructor übergebene variable an eine threadinterne variable weitergeben

Ja, und wenn du einfach nur beide Variablen als TBitmap deklarierst, hast du keine Probleme. Beide Variablen sind intern Zeiger und zeigen auf ein und dieselbe TBitmap Intanz.

SirThornberry 5. Mai 2008 15:04

Re: bitmap in array einlesen -> zugriffverletzung
 
Wenn TBitmap nicht Threadsafe ist bringt das aber rein gar nichts. Zwar werden dann icht die Objectdaten übergeben sondern eben nur ein Pointer auf die Instanzdaten aber wenn du mit dem Object arbeitest werden ja dann doch wieder diese Daten angesprochen (auch beim dereferenzieren wenn man das wirklich machen wöllte). Wenn ein Object also nicht Threadsafe ist kann man es auch nicht über den Umweg von Pointern bearbeiten um es Threadsafe zu machen.
Sinnvoller wäre hier die Verwendung von Handles:
Delphi-Quellcode:
//Dem Thread das Bitmaphandle übergeben
//im Thread:
var
  mybitmap: TBitmap;
begin
  myBitmap := TBitmap.Create();
  myBitmap.Handle := uebergebenes_Bitmap_Handle;
  //now you can work with the bitmap
  myBitmap.Handle := 0;
  myBitmap.Free;
end;

Muetze1 5. Mai 2008 16:32

Re: bitmap in array einlesen -> zugriffverletzung
 
Zitat:

Zitat von SirThornberry
Wenn TBitmap nicht Threadsafe ist bringt das aber rein gar nichts. Zwar werden dann icht die Objectdaten übergeben sondern eben nur ein Pointer auf die Instanzdaten aber wenn du mit dem Object arbeitest werden ja dann doch wieder diese Daten angesprochen (auch beim dereferenzieren wenn man das wirklich machen wöllte). Wenn ein Object also nicht Threadsafe ist kann man es auch nicht über den Umweg von Pointern bearbeiten um es Threadsafe zu machen.

Wieso nicht? Er muss nur dafür sorgen die Instanz in anderen Threads nicht anzufassen, so lange ein Thread damit arbeitet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:26 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