AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Array ohne Stack Overflow / nicht genügend Arbeitsspeicher
Thema durchsuchen
Ansicht
Themen-Optionen

Array ohne Stack Overflow / nicht genügend Arbeitsspeicher

Ein Thema von cramer · begonnen am 24. Jul 2008 · letzter Beitrag vom 25. Jul 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von cramer
cramer

Registriert seit: 23. Jun 2004
Ort: Velbert (NRW)
96 Beiträge
 
Delphi 2006 Enterprise
 
#1

Array ohne Stack Overflow / nicht genügend Arbeitsspeicher

  Alt 24. Jul 2008, 18:03
Hallo,
bei der Suche nach einer Array-Lösung bin auf folgenden Beitrag gestoßen: " nicht genügend arbeitspeicher verfügbar von: easteregg "
Er hat seinerzeit aufgegeben und da ich keine weiteren Beiträge zum Problem gefunden habe, möchte ich allen, die noch nach einer Lösung suchen, diesen Hinweis nicht vorenthalten.

Mein System hat 2GB RAM und läuft unter WinXpSp3. Das Problem lag an einem zu kleinen DesktopHeap-Eintrag.

Original:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Contro l\Session Manager\SubSystems (Windows=%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,3072,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16)

Changed:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Contro l\Session Manager\SubSystems (Windows=%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,8192,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16)

Seither gehört die Meldung der Vergangenheit an.

Nun aber zu meiner eigentlichen Frage (BDS2006)
Ich benötige ein 1MB Array of Byte in etwa so
var
// buffer : array [0..1048575] of Byte; // 1M geht aber nicht, Overflow Exception
// buffer : array [0..65535] of Byte; // 64K geht
// buffer : array [0..262143] of Byte; // 256K geht auch noch

Gibt es für 1MB ein Lösung ?
Falls nicht und ich begnüge mich mit 256K, kann es auf anderen Systemen trotzdem zu einem Overflow kommen ?
Thanks in advance
Erfahrung ist etwas, daß man erst bekommt, kurz nachdem man es dringend gebraucht hätte.
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: Array ohne Stack Overflow / nicht genügend Arbeitsspeich

  Alt 24. Jul 2008, 18:13
Delphi-Quellcode:
buffer: array of Byte;
begin
  SetLength(buffer, 1024*1024);
Dynamisches Array heisst das - statische lokale Arrays wandern auf den begrenzten Stack, dynamische Arrays wandern immer auf den Heap (und der ist riesig).
  Mit Zitat antworten Zitat
Benutzerbild von cramer
cramer

Registriert seit: 23. Jun 2004
Ort: Velbert (NRW)
96 Beiträge
 
Delphi 2006 Enterprise
 
#3

Re: Array ohne Stack Overflow / nicht genügend Arbeitsspeich

  Alt 24. Jul 2008, 18:24
Super, danke, eingebaut, getestet, kein Overflow, aber
sizeof(buffer) gibt wohl 4 Byte (den Pointer oder so) zurück,
geht aber bestimmt auch anders oder ?
Erfahrung ist etwas, daß man erst bekommt, kurz nachdem man es dringend gebraucht hätte.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Array ohne Stack Overflow / nicht genügend Arbeitsspeich

  Alt 24. Jul 2008, 18:28
Hallo,

length(array) sollte gehen,
den obersten Wert bekommst Du mit high(Array) der kleinste sollte 0 sein.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: Array ohne Stack Overflow / nicht genügend Arbeitsspeich

  Alt 24. Jul 2008, 19:27
Anstelle von sizeof bekommst du die Datengröße von einem dynamischen Array mit Length + sizeof auf ein einzelnes Element:
size := sizeof(yourarray[0]) * Length(yourarray);
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Apollonius

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

Re: Array ohne Stack Overflow / nicht genügend Arbeitsspeich

  Alt 24. Jul 2008, 19:33
Wenn man die Größe sowieso statisch setzt - spricht etwas dagegen, die Stack-Größe in den Projekt-Optionen zu erhöhen?
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 cramer
cramer

Registriert seit: 23. Jun 2004
Ort: Velbert (NRW)
96 Beiträge
 
Delphi 2006 Enterprise
 
#7

Re: Array ohne Stack Overflow / nicht genügend Arbeitsspeich

  Alt 25. Jul 2008, 07:31
Danke für die Tips.
Nun gibt es mit dem dynamischen Array aber einen Range Error bei FileRead
Delphi-Quellcode:
const int64Null : int64 = 0;
var
  qFile : Integer;
  buffersize,size, rest, len : cardinal;
  buffer: array of Byte;
begin
  buffersize := 128*128; // 16K als Beispiel
  SetLength(buffer, BufferSize); // (Edit) Ja, sorry, hatte ich nur nicht in den Beitrag kopiert
  // ... sonstiges Fileopen Geraffel
    qFile := FileOpen(qName,fmOpenRead or fmShareDenyNone);
    if qFile >= 0 then begin
      // Zum Ende um size der Datei zu ermitteln
      size := FileSeek(qFile,int64Null,soFromEnd);
      // Zum Anfang fürs Lesen
      FileSeek(qFile,int64Null,soFromBeginning);

      len := FileRead(qFile,buffer,BufferSize); <-- RangeError
Erfahrung ist etwas, daß man erst bekommt, kurz nachdem man es dringend gebraucht hätte.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Array ohne Stack Overflow / nicht genügend Arbeitsspeich

  Alt 25. Jul 2008, 07:59
Guten Morgen,

mal eine blöde Frage, aber das Array hast Du auch mit Setlength irgendwo eingestellt?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Win32.API

Registriert seit: 23. Mai 2005
312 Beiträge
 
#9

Re: Array ohne Stack Overflow / nicht genügend Arbeitsspeich

  Alt 25. Jul 2008, 08:18
len := FileRead(qFile,buffer[0],BufferSize);
  Mit Zitat antworten Zitat
Benutzerbild von cramer
cramer

Registriert seit: 23. Jun 2004
Ort: Velbert (NRW)
96 Beiträge
 
Delphi 2006 Enterprise
 
#10

Re: Array ohne Stack Overflow / nicht genügend Arbeitsspeich

  Alt 25. Jul 2008, 08:35
Hi Klaus
(Edit) Ja, sorry, hatte ich nur nicht in den Beitrag kopiert.

Hi Apollonius
Die Version mit einem 2MB Stack in den Projektoptionen funktioniert.
Allerdings würde mir die Dynamische Lösung, wenns funktionieren würde, besser gefallen.

Hi Win32.API
das war die Lösung. Aber warum ?
Bei einem statischen Array wird bei Buffer automatisch die Adresse des ersten Bytes genommen ?
und wohin zeigt denn buffer bei einem Dynamischen Array ?
Erfahrung ist etwas, daß man erst bekommt, kurz nachdem man es dringend gebraucht hätte.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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:43 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