AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi bitmap in array einlesen -> zugriffverletzung
Thema durchsuchen
Ansicht
Themen-Optionen

bitmap in array einlesen -> zugriffverletzung

Ein Thema von griever · begonnen am 3. Mai 2008 · letzter Beitrag vom 5. Mai 2008
Antwort Antwort
griever

Registriert seit: 27. Apr 2008
19 Beiträge
 
#1

bitmap in array einlesen -> zugriffverletzung

  Alt 3. Mai 2008, 19:14
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;
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: bitmap in array einlesen -> zugriffverletzung

  Alt 3. Mai 2008, 19:18
Hast du überhaupt mit SetLength die Array-Größe gesetzt?
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von olee
olee

Registriert seit: 16. Feb 2008
Ort: Boppard
540 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: bitmap in array einlesen -> zugriffverletzung

  Alt 3. Mai 2008, 19:20
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!
Björn Zeutzheim
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: bitmap in array einlesen -> zugriffverletzung

  Alt 3. Mai 2008, 19:24
was um himmelswillen ist das und was bezweckst du damit?
Delphi-Quellcode:
pic: ptobitmap;
[...]
ptobitmap = ^Tbitmap;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
griever

Registriert seit: 27. Apr 2008
19 Beiträge
 
#5

Re: bitmap in array einlesen -> zugriffverletzung

  Alt 4. Mai 2008, 00:57
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
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
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: bitmap in array einlesen -> zugriffverletzung

  Alt 4. Mai 2008, 01:08
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 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.
  Mit Zitat antworten Zitat
griever

Registriert seit: 27. Apr 2008
19 Beiträge
 
#7

Re: bitmap in array einlesen -> zugriffverletzung

  Alt 4. Mai 2008, 08:38
@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?
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#8

Re: bitmap in array einlesen -> zugriffverletzung

  Alt 4. Mai 2008, 14:46
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.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

Re: bitmap in array einlesen -> zugriffverletzung

  Alt 5. Mai 2008, 15:04
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#10

Re: bitmap in array einlesen -> zugriffverletzung

  Alt 5. Mai 2008, 16:32
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.
  Mit Zitat antworten Zitat
Antwort Antwort


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 11:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz