![]() |
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:
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 |
AW: Dynamisches Array Grenze?
![]() 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: ![]() Das hätte das Problem erklären können, hätte es am Array gelegen ;) |
AW: Dynamisches Array Grenze?
Delphi-Quellcode:
Das währe die technische Seite. (Referenzzählung+Länge+Daten)
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)); > 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. |
AW: Dynamisches Array Grenze?
Zitat:
Wieder mal ein Delphi problem in C++ gibts das nicht. grrr.. Pixels sind nicht vollständig. gruss |
AW: Dynamisches Array Grenze?
Zitat:
|
AW: Dynamisches Array Grenze?
Zitat:
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 |
AW: Dynamisches Array Grenze?
Delphi-Quellcode:
hab mir den aufräum Code jetzt mal gespart
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); -> du setzt bei dir die Bildgroesse nicht: bmInfo.bmiHeader.biBitCount := tempBitmap.bmiHeader.biWidth * tempBitmap.bmiHeader.biHeight * tempBitmap.bmiHeader.biBitCount div 8 |
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 |
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.
|
AW: Dynamisches Array Grenze?
Zitat:
Habe ja schon festgestellt woran es liegt CreateDIBSection gibt mir nicht die korrekte anzahl an pixel gruss |
AW: Dynamisches Array Grenze?
Im MSDN reiten die für hSection so auf NULL herum, dann würde die API auch den Speicher reservieren. Wenn nicht NULL, dann muss man den Speicher selber bereitstellen.
Also evtl. so?
Delphi-Quellcode:
hDirectBitmap := CreateDIBSection(hDirectDC, bmInfo, DIB_RGB_COLORS, Pointer(Pixels), NULL, 0);
|
AW: Dynamisches Array Grenze?
Das werd ich mal testen Danke.
Nur wo ist NULL deklariert .. hmm OK in Variants Leider nicht Zitat:
Zitat:
EDIT: Sieht so aus Zitat:
Könnte den hFile parameter mit INVALID_HANDLE_VALUE befüllen aber ob es damit getan ist? Warum stellt Delphi den Parameter NULL zur verfügung wenn es nicht damit umgehen kann. Oder ich bin einfach zu :stupid::wall: In C++ sieht es so aus
Code:
Anders hab ich es auch nicht, abgesehen von "NULL"
HBITMAP hBitmap = CreateDIBSection(hDC, (BITMAPINFO*)&bmi, DIB_RGB_COLORS,(void**)&ppvBits , NULL, 0);
Hab mit CreateDIBSection schon viel gemacht aber das schlägt dem Fass den Boden aus. :pale: gruss |
AW: Dynamisches Array Grenze?
Zitat:
aber das hat mit diesem NULL nichts gemeinsam. nil oder 0, je nach dem, ob der Parameter als Zeigertyp oder als ordinaler Typ deklariert ist. |
AW: Dynamisches Array Grenze?
Das ist in erster Linie ein Problem des Grafiktreibers.
Je nach Grafikkarte und Hersteller kann auch schon bei 1024x768 Schluss sein. Allgemein kann man sich nicht darauf verlassen das man größere geräteabhängige Bitmaps erzeugen kann, als die maximal darstellbar Auflösung der Hardware hergibt. |
AW: Dynamisches Array Grenze?
Zitat:
Delphi-Quellcode:
Zumal bei einer Grafikkarte Gforce gtx 460 1GB (GPU Ram)eingestellter Auflösung von 1920x1200
ClientDC := GetWindowDC(ParentHandle);
if (GetDeviceCaps(ClientDC, RASTERCAPS) and RC_PALETTE = RC_PALETTE) then begin Result := False; exit; end; 8GB ram / Speicher kein Problem sein dürfte. Zitat:
Außerdem habe ein programm in C++ getestet ohne Bildmanipulation und dort wird der Speicher bzw.. die richtige anzahl von Pixeln auf meinem System ohne Probleme verwaltet. Zitat:
gruss |
AW: Dynamisches Array Grenze?
Hau doch mal den ganzen Quelltext von der DLL raus, sonst kann doch keiner richtig debuggen.
Sonst stocheren wir hier nur so rum und das Problem ist vielleicht ganz woanderes. |
AW: Dynamisches Array Grenze?
Zitat:
![]() gruss |
AW: Dynamisches Array Grenze?
Das Problem scheint zumindest ähnlich zu sein:
![]() Zitat:
|
AW: Dynamisches Array Grenze?
Ähm du solltest keine Dyn. Arrays als Output einer Funktion verwenden, da u.a. z.b. noch die Laenge gespeichert wird. (Genau müsste ich da jetzt auch erstmal nachschauen)
Du kannst eher sowas nehmen:
Delphi-Quellcode:
Außerdem solltest du in deinem Code mal die globalen Variablen entfernen. Und zu guter letzt: Lies dir nochmal meinen 2. Post mit meinem Beispiel KOMPLETT durch, da solltest die Lösung finden.
type
TMyPixels = array[0..4096*4096-1] of Cardinal; PMyPixels = ^TMyPixels; var Pixels: PPixels; CreateDIBSection(....,Pixels,....); Pixels[0]... Ubrigens hast du da noch mehr Fehler im Code. Bei:
Delphi-Quellcode:
fehlt mit Sicherheit ein -1
nSize := bm.bmWidth * bm.bmHeight;
for IntI := 0 to nSize do und statt einem "array of cardinal" bietet sich wohl auch ein "array of TRGBQuad" oder eine eigene Definition an. |
AW: Dynamisches Array Grenze?
Zitat:
Zitat:
CreateDibSection gibt die Pixelanzahl selbst zurück also dimensioniert den Speicher im normalfall selbst. Wenn aber hSection nicht gleich NULL ist benötige ich ein mapping. Das geht aber über HBitmap nicht. Zitat:
bmInfo.bmiHeader.biBitCount kannst du nicht einfach so festlegen (bzw. selbst berechen) dafür gibt es vorgaben abhängig vom Bitmap also 1,4,8,16,24 bis Win98 und 1,4,8,16,24,32 Bit ab Win2000 ![]() Quelltext ist ja oben.. Wenn zeit hast kannst es ja berichtigen. Kannst das bitte im Thread ![]() Da es ja jetzt nicht mehr um das Array alleine geht. Danke. EDIT: Es lag wirklich nur an nSize -1 gruss |
AW: Dynamisches Array Grenze?
Wie gesagt, ein dynamisches array solltest du nicht verwenden. Un mit dem ganzen post lesen war folgendes gemeint:
Delphi-Quellcode:
ich hatte mich mit SizeImage und BitCount vertan (ist in meinem Bsp. aber richtig) -> du setzt biSizeImage nicht
bmInfo.bmiHeader.biSizeImage := tempBitmap.bmiHeader.biWidth * tempBitmap.bmiHeader.biHeight * tempBitmap.bmiHeader.biBitCount div 8;
|
AW: Dynamisches Array Grenze?
Nur daß oftmals die Datengrößen der einzelnen Zeilen auf ganze Integer (4 Byte) aufgerundet werden, was man bei der Berechnung eventuell noch beachten müßte.
|
AW: Dynamisches Array Grenze?
Zitat:
Bei der Form sind es 45MB und jetzt kommt's beim Desktop 900plus Irgendwo hapert es da noch ganz schön. Hab viel vergessen nach meiner Krankheit das ist Fakt :) Was ist besser an einem 1 Dimensionalen statischen Array? Also was bringt es an Geschwindigkeit ich habe es ja versucht kann aber den vorteil nicht erkennen Funktionieren tut es natürlich auch. mit biSizeImage werde ich auch nochmal versuchen .. Danke EDIT: Jup das hat mir geholfen der Tip mit dem Statischen Array wird jetzt kein Speicher mehr verschwendet 2 MB sind OK da kann man mit leben. biSizeImage hab ich mal addiert obwohl mir im moment nicht ganz klar ist was mir das bringt in verbindung mit CreateDibSection. Es wird nirgendwo verwendet. Danke für eure Hilfe. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:34 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-2025 by Thomas Breitkreuz