Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Dynamisches Array Grenze? (https://www.delphipraxis.net/167418-dynamisches-array-grenze.html)

EWeiss 28. Mär 2012 18:43

Dynamisches Array Grenze?
 
Beim einlesen vom Desktop hat mein Array eine grenze von 1920x1200 = 2304000

Gibt es eine Obergrenze in Delphi für dynamische Arrays also 65535 ?
Denke nicht oder?

Auf jedenfall tritt jetzt ein Fehler auf
Zitat:

Erste Gelegenheit für Exception bei $76D5B9BC. Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung bei Adresse 003618F6 in Modul 'Dimmed.dll'. Lesen von Adresse 041DA000'. Prozess DimmedTest.exe (4044)
Leider mal wieder nicht zu identifizieren was da abgeht.
Kann ja nicht über 2 Millionen Pixel debuggen.

EDIT:
131071 macht er zu größer scheint das Array nicht zu dimensionieren zu sein.
CreateDIBSection will nicht mehr rausspucken. Das ist mein Problem denke ich nicht das Array.

Was für ein Sch...s


gruss

FlatIron 28. Mär 2012 18:55

AW: Dynamisches Array Grenze?
 
http://stackoverflow.com/questions/9...rray-in-delphi

Solltest eigentlich genug Platz haben. Oder habe ich da was falsch verstanden? Mehr kann ich leider nicht dazu sagen

EDIT: Ich hätte besser noch weiter gelesen. Hier steht noch was zur Praxis:
http://stackoverflow.com/a/985108

Das hätte das Problem erklären können, hätte es am Array gelegen ;)

himitsu 28. Mär 2012 19:28

AW: Dynamisches Array Grenze?
 
Delphi-Quellcode:
MaxLength := (High(Integer) - 2 * SizeOf(Integer)) div SizeOf(MyArray[0]);

// für 32-Bit-Delphi
type
  TMyArray = array of XXX;

MaxLength := ($7FFFFFFF - 8) div SizeOf(XXX);
MaxLength := Trunc(2147483639 / SizeOf(XXX));
Das währe die technische Seite. (Referenzzählung+Länge+Daten)
> stackoverflow erzählt halt manchmal auch nur Mist.

Real ist nur soviel möglich, wie der größte zusammenhängende freie Speicherblock an Platz bietet.

EWeiss 28. Mär 2012 19:28

AW: Dynamisches Array Grenze?
 
Zitat:

Zitat von FlatIron (Beitrag 1159133)
http://stackoverflow.com/questions/9...rray-in-delphi

Solltest eigentlich genug Platz haben. Oder habe ich da was falsch verstanden? Mehr kann ich leider nicht dazu sagen

JO liegt nicht am Array das problem ist CreateDIBSection gibt mir nicht mehr wie 131071 Pixel.
Wieder mal ein Delphi problem in C++ gibts das nicht.

grrr..

Pixels sind nicht vollständig.

gruss

brechi 28. Mär 2012 20:48

AW: Dynamisches Array Grenze?
 
Zitat:

Zitat von EWeiss (Beitrag 1159137)
Zitat:

Zitat von FlatIron (Beitrag 1159133)
http://stackoverflow.com/questions/9...rray-in-delphi

Solltest eigentlich genug Platz haben. Oder habe ich da was falsch verstanden? Mehr kann ich leider nicht dazu sagen

JO liegt nicht am Array das problem ist CreateDIBSection gibt mir nicht mehr wie 131071 Pixel.
Wieder mal ein Delphi problem in C++ gibts das nicht.

grrr..

gruss

Das ist mit Sicherheit kein Delphi Problem weils ne WinAPI ist die genauso unter Delphi wie auch unter C++ funktioniert. Das Problem wird da eher vorm Bildschirm sitzen :wink:

EWeiss 28. Mär 2012 21:09

AW: Dynamisches Array Grenze?
 
Zitat:

Zitat von brechi (Beitrag 1159143)
Das Problem wird da eher vorm Bildschirm sitzen :wink:

Ach ja?
Dann sag mir doch mal bitte welchen Einfluss ich auf CreateDIBSection nehmen kann
wenn ich nur 131071 Pixel zurück geiefert bekomme?

Bekomme ich mehr gebe ich dir recht .. andernfalls na ja du weist schon ;)

Code? OK!

Delphi-Quellcode:
begin

  hRetBmp := 0;

   if hBmp <> 0 then
   begin
      hBufferDC := CreateCompatibleDC(0);
      if hBufferDC <> 0 then
      begin
      hTmpBitmap := 0;
         if hBmpDC <> 0 then
            if (hBmp = GetCurrentObject(hBmpDC, OBJ_BITMAP)) then
            begin
               hTmpBitmap := CreateBitmap(1, 1, 1, 1, nil);
               SelectObject(hBmpDC, hTmpBitmap);
            end;

         hPrevBufObject := SelectObject(hBufferDC, hBmp);

         hDirectDC := CreateCompatibleDC(0);
         if hDirectDC <> 0 then
         begin
            GetObject(hBmp, sizeof(bm), @bm);

           ZeroMemory(@bmInfo, sizeof(BITMAPINFO));
            bmInfo.bmiHeader.biSize        := sizeof(bmInfo.bmiHeader);
            bmInfo.bmiHeader.biWidth     := bm.bmWidth;
            bmInfo.bmiHeader.biHeight     := bm.bmHeight;
            bmInfo.bmiHeader.biPlanes     := 1;
            bmInfo.bmiHeader.biBitCount   := 32;

            hDirectBitmap := CreateDIBSection(hDirectDC, bmInfo, DIB_RGB_COLORS, Pointer(Pixels), 0, 0);
            if hDirectBitmap <> 0 then

gruss

brechi 28. Mär 2012 21:37

AW: Dynamisches Array Grenze?
 
Delphi-Quellcode:
var
  tempBitmap: BITMAPINFO;
  pvBits: Pointer;
  mDC: THandle;
  mainBitmap: Thandle;
  x, y: integer;
  q: ^TRGBTriple;
  idx: integer;
begin
  ZeroMemory(@tempBitmap, sizeof(BITMAPINFO));
  tempBitmap.bmiHeader.biSize := SizeOf(BITMAPINFOHEADER);
  tempBitmap.bmiHeader.biBitCount := 24;
  tempBitmap.bmiHeader.biWidth := 1920;
  tempBitmap.bmiHeader.biHeight := 1080;
  tempBitmap.bmiHeader.biPlanes := 1;
  tempBitmap.bmiHeader.biCompression := BI_RGB;
  tempBitmap.bmiHeader.biSizeImage := tempBitmap.bmiHeader.biWidth * tempBitmap.bmiHeader.biHeight * 3;
  mDC := CreateCompatibleDC(0);
  mainBitmap := CreateDIBSection(mDC, tempBitmap, DIB_RGB_COLORS, pvBits, 0, 0);
  SelectObject(mDC, mainBitmap);
  FillChar(pvBits^, tempBitmap.bmiHeader.biWidth * tempBitmap.bmiHeader.biHeight * 3, 255);
  for y := 0 to tempBitmap.bmiHeader.biHeight - 1 do begin
    for x := 0 to tempBitmap.bmiHeader.biWidth - 1 do begin
      idx := y * tempBitmap.bmiHeader.biWidth + x;
      q := Pointer(Integer(pvBits) + idx * 3);
      q.rgbtBlue := Round(x * 255 / tempBitmap.bmiHeader.biWidth);
      q.rgbtRed := Round(y * 255 / tempBitmap.bmiHeader.biHeight);
      q.rgbtGreen := 55;
    end;
  end;
  BitBlt(canvas.Handle, 0, 0, tempBitmap.bmiHeader.biWidth, tempBitmap.bmiHeader.biHeight, mDC, 0, 0, SRCCOPY);
hab mir den aufräum Code jetzt mal gespart

-> du setzt bei dir die Bildgroesse nicht: bmInfo.bmiHeader.biBitCount := tempBitmap.bmiHeader.biWidth * tempBitmap.bmiHeader.biHeight * tempBitmap.bmiHeader.biBitCount div 8

EWeiss 28. Mär 2012 21:48

AW: Dynamisches Array Grenze?
 
Nu was ist bei dir anders als bei mir?
Im Pointer(Pixels) ist das array welches von CreateDIBSection zurück geliefert wird.
Das ist ja das schöne daran das ich mir so das suchen der pixels mit GetPixel sparen kann.
Was soll ich nun machen das mir die richtige Anzahl abhängig vom Bild (Bilddimension) zurückgegeben wird?


gruss

isilive 28. Mär 2012 21:58

AW: Dynamisches Array Grenze?
 
Hab gestern dynamische Arrays gebraucht. Da war Schluss bei 33 Mio. Elementen und einem theoretischen Ramverbrauch von Arraycount x Elementsize(40 Bytes) = 1,3GB. Grösser ging dann nicht mehr. Win7 32bit, kein 3GB Switch aktiviert.

EWeiss 28. Mär 2012 22:01

AW: Dynamisches Array Grenze?
 
Zitat:

Zitat von isilive (Beitrag 1159150)
Hab gestern dynamische Arrays gebraucht. Da war Schluss bei 33 Mio. Elementen und einem theoretischen Ramverbrauch von Arraycount x Elementsize(40 Bytes) = 1,3GB. Grösser ging dann nicht mehr. Win7 32bit, kein 3GB Switch aktiviert.

Das ist auch nicht mein problem.. Danke schön :)
Habe ja schon festgestellt woran es liegt CreateDIBSection gibt mir nicht die korrekte anzahl an pixel

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:32 Uhr.
Seite 1 von 3  1 23      

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