Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Der Stack läuft über, der olle (https://www.delphipraxis.net/54079-der-stack-laeuft-ueber-der-olle.html)

Eichhoernchen 27. Sep 2005 17:14


Der Stack läuft über, der olle
 
Ich hab da mal nen Problem, und zwar würd ich gern ein

array[0..640, 0..480] of Cardinal

verwenden, nur leider sagt mit Delphi sobald ich es benutzen will Stack overflow.

mit nem array[0..640, 0..480] of word

klappt alles, nur leider ist word zu klein für mein Anliegen ich brauch schon was größeres, was mach ich da?


Wer hat Rat?

Dax 27. Sep 2005 17:15

Re: Der Stack läuft über, der olle
 
Das Array als array of array of Cardinal deklarieren und vor der Benutzung mit SetLength(MyArray, 640, 480) initialisieren. Dann liegt das Array auf dem Heap und dein Stack ist sicher ;)

Eichhoernchen 27. Sep 2005 17:43

Re: Der Stack läuft über, der olle
 
werde ich sofort versuchen, ich berichte dann ob der Heap dann überläuft! (falls er das kann[ich weiß es net])

Wenn es klappt bestatte ich bericht!


Kann mir denn einer sagen warum der Stack da überläuft?? Oder wie kann ich den Stack vergrößern?

jbg 27. Sep 2005 17:57

Re: Der Stack läuft über, der olle
 
Weil der Stack begrenzt ist um Endlosrekusionen abfangen zu können.
Wenn du nun dein Array auf dem Stack anlegst, dann wird der Speicherbereich beim Eintreten in die Funktion auf dem Stack reserviert und er läuft über. Da der Compiler aber die Größe des Arrays kennt, kann er die Kompilierung abbrechen, da das Programm sowieso an der stellen mit EStackOverflow abbrechen würde.

himitsu 27. Sep 2005 18:17

Re: Der Stack läuft über, der olle
 
Falls möglich, kannst du dieses Array auch global definieren ... dann kommt's net in den Stack rein und es gibt diesbezüglich keine Probleme.

die Andere Möglichkeit, ist wie schon gesagt wurde ein dynamisches Array ... dafür benötigst du dann allerdings 2-mal SetLength.

Die 3. Variante ist, das du einen Pointer auf diese Struktur generrierst und diesen dann per New mit leben erfüllst

Delphi-Quellcode:
Type A = array[0..640, 0..480] of word;
 P = ^A;

New(P);

P^[x, y] := ...

Aber nicht vergessen, bei den letzten beiden Varianten bist du für das Freibgeben zuständig.

SirThornberry 27. Sep 2005 18:28

Re: Der Stack läuft über, der olle
 
wenn man das array im private eines Objectes definiert, wird es dann auch auf dem Stack abgelegt wenn das Object erzeugt wird? (wenn nicht könnte man dadurch auch auf die globale verzichten sowie auf das SetLength)

himitsu 27. Sep 2005 18:42

Re: Der Stack läuft über, der olle
 
Für die ganzen Pointersachen, wie dynamische Arrays, Klassen, Strings(is ja meistens och nur'n dynamisches Array) wird ganz normal im RAM was reserviert ... der Stack bleibt verschont.

Im Stack landen vorwiegend die (Rück)Sprungadressen und einfachen lokalen Variablen, sowie die Pointer der restlichen lokalen Variablen (dynamisches und klassen)

Eichhoernchen 27. Sep 2005 18:51

Re: Der Stack läuft über, der olle
 
hmm ich hab das schon als Globale deklariert:

type TBuddha = array[0..640, 0..480] of Cardinal;

var itersr, itersg, itersb : TBuddha;


und diese arrays werden in verschieden Procedure und Funktionen bearbeitet!



Hmm, habe leider noch keine zeit gehabt das mit den Dynamischen zu Probieren aber besser würde mir ehh das mit den Pointern gefallen, da würd ich mir das setlength sparen.

Naja doof das ich nicht einfach nen größeren Stack machen kann.

jbg 27. Sep 2005 18:58

Re: Der Stack läuft über, der olle
 
Zitat:

Zitat von Eichhoernchen
aber besser würde mir ehh das mit den Pointern gefallen

Beim dyn. Array kümmert ich Delphi um die Freigabe. Bei New/Dispose ist es der Fehler vor dem Bildschirm, der das erledigen muss. Und wir alle wissen, wie unzuverlässig dieser ist.

SirThornberry 27. Sep 2005 19:07

Re: Der Stack läuft über, der olle
 
oder eben statt dem globalen das einfach in die Klasse packen.
also hier her
Delphi-Quellcode:
[...]
type
  TForm1 = class(TForm)
  [...]
  private
    fYourArray: array[0..640, 0..480] of Cardinal;


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:19 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