AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Dynamisches Array Grenze?

Ein Thema von EWeiss · begonnen am 28. Mär 2012 · letzter Beitrag vom 30. Mär 2012
Antwort Antwort
Seite 2 von 3     12 3   
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#11

AW: Dynamisches Array Grenze?

  Alt 29. Mär 2012, 02:27
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?
hDirectBitmap := CreateDIBSection(hDirectDC, bmInfo, DIB_RGB_COLORS, Pointer(Pixels), NULL, 0);
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
6.147 Beiträge
 
Delphi 2010 Architect
 
#12

AW: Dynamisches Array Grenze?

  Alt 29. Mär 2012, 03:10
Das werd ich mal testen Danke.
Nur wo ist NULL deklariert .. hmm OK in Variants

Leider nicht
Zitat:
Erste Gelegenheit für Exception bei $7715B9BC. Exception-Klasse EVariantTypeCastError mit Meldung 'Variante des Typs (Null) konnte nicht in Typ (Int64) konvertiert werden'. Prozess DimmedTest.exe (344)
Zitat:
dann muss man den Speicher selber bereitstellen.
Wenn ich jetzt wüßte wie, bezogen auf diese function, dann wäre es ja gut

EDIT:
Sieht so aus
Zitat:
If hSection is not NULL, it must be a handle to a file mapping object created by calling the CreateFileMapping function.
Mein Problem das ich aber habe verfüge nur über ein HBitmap und lade keine Datei.
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

In C++ sieht es so aus
Code:
HBITMAP hBitmap = CreateDIBSection(hDC, (BITMAPINFO*)&bmi, DIB_RGB_COLORS,(void**)&ppvBits , NULL, 0);
Anders hab ich es auch nicht, abgesehen von "NULL"
Hab mit CreateDIBSection schon viel gemacht aber das schlägt dem Fass den Boden aus.

gruss

Geändert von EWeiss (29. Mär 2012 um 05:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
34.931 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#13

AW: Dynamisches Array Grenze?

  Alt 29. Mär 2012, 09:11
Zitat:
Nur wo ist NULL deklariert .. hmm OK in Variants
Fast, das NULL ist Variants ist ein Variant mit dem Wert NULL,
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
1.213 Beiträge
 
Delphi 2007 Professional
 
#14

AW: Dynamisches Array Grenze?

  Alt 29. Mär 2012, 09:14
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.
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
6.147 Beiträge
 
Delphi 2010 Architect
 
#15

AW: Dynamisches Array Grenze?

  Alt 29. Mär 2012, 14:22
Das ist in erster Linie ein Problem des Grafiktreibers.
Je nach Grafikkarte und Hersteller kann auch schon bei 1024x768 Schluss sein.
Wäre es ein Grafikkarten problem dann würde diese Abfrage fehlschlagen.
Delphi-Quellcode:
  ClientDC := GetWindowDC(ParentHandle);
  if (GetDeviceCaps(ClientDC, RASTERCAPS) and RC_PALETTE = RC_PALETTE) then
  begin
    Result := False;
    exit;
  end;
Zumal bei einer Grafikkarte Gforce gtx 460 1GB (GPU Ram)eingestellter Auflösung von 1920x1200
8GB ram / Speicher kein Problem sein dürfte.

Zitat:
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.
Tue ich auch nicht wenn überhaupt dann die aktuelle größe des Desktop.

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:
nil oder 0, je nach dem, ob der Parameter als Zeigertyp oder als ordinaler Typ deklariert ist.
Jo und das habe ich ja also 0 für Cardinal.

gruss

Geändert von EWeiss (29. Mär 2012 um 14:48 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
2.033 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#16

AW: Dynamisches Array Grenze?

  Alt 29. Mär 2012, 16:01
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.
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
6.147 Beiträge
 
Delphi 2010 Architect
 
#17

AW: Dynamisches Array Grenze?

  Alt 29. Mär 2012, 16:24
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.
Deinen Wunsch wurde entsprochen

gruss
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
1.213 Beiträge
 
Delphi 2007 Professional
 
#18

AW: Dynamisches Array Grenze?

  Alt 29. Mär 2012, 17:14
Das Problem scheint zumindest ähnlich zu sein:
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
Zitat:
Systemwide size limitations
Windows apparently may enforce systemwide limits on available memory for CreateCompatibleBitmap. (According to some sources, this is because device-dependent bitmaps must reside in video card RAM.) If you're getting ERROR_NOT_ENOUGH_MEMORY errors when calling CreateCompatibleBitmap, the solution is to use device-independent bitmaps (DIBs) instead.
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
810 Beiträge
 
#19

AW: Dynamisches Array Grenze?

  Alt 29. Mär 2012, 17:21
Ä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:
type
   TMyPixels = array[0..4096*4096-1] of Cardinal;
   PMyPixels = ^TMyPixels;
var
  Pixels: PPixels;
CreateDIBSection(....,Pixels,....);
Pixels[0]...
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.

Ubrigens hast du da noch mehr Fehler im Code. Bei:
Delphi-Quellcode:
          nSize := bm.bmWidth * bm.bmHeight;

          for IntI := 0 to nSize do
fehlt mit Sicherheit ein -1
und statt einem "array of cardinal" bietet sich wohl auch ein "array of TRGBQuad" oder eine eigene Definition an.

Geändert von brechi (29. Mär 2012 um 17:26 Uhr) Grund: Erweiterung
  Mit Zitat antworten Zitat
Benutzerbild von EWeiss
EWeiss

Registriert seit: 16. Okt 2010
6.147 Beiträge
 
Delphi 2010 Architect
 
#20

AW: Dynamisches Array Grenze?

  Alt 29. Mär 2012, 19:08
Zitat:
Und zu guter letzt: Lies dir nochmal meinen 2. Post mit meinem Beispiel KOMPLETT durch, da solltest die Lösung finden.
Habe deinen Thread schon gelesen aber lösungen sind da keine was den Speicher angeht.
Zitat:
Delphi-Quellcode:
type
    TMyPixels = array[0..4096*4096-1] of Cardinal;
    PMyPixels = ^TMyPixels;
 var
   Pixels: PPixels;
 CreateDIBSection(....,Pixels,....);
 Pixels[0]...
Eine alternative aber kein muss Verstehe hier den zusammenhang nicht in verbindung mit dem Speicher.
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:
Delphi-Quellcode:
nSize := bm.bmWidth * bm.bmHeight;
for IntI := 0 to nSize do
fehlt mit Sicherheit ein -1
Ok wo du Recht hast .. hast du recht.

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

Siehe BitCount

Quelltext ist ja oben..
Wenn zeit hast kannst es ja berichtigen.

Kannst das bitte im Thread Dimmed Sample posten ?
Da es ja jetzt nicht mehr um das Array alleine geht.
Danke.

EDIT:
Es lag wirklich nur an nSize -1

gruss

Geändert von EWeiss (29. Mär 2012 um 23:36 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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