AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Der Stack läuft über, der olle

Ein Thema von Eichhoernchen · begonnen am 27. Sep 2005 · letzter Beitrag vom 27. Sep 2005
Antwort Antwort
Eichhoernchen

Registriert seit: 22. Apr 2004
Ort: Hagen
322 Beiträge
 
Turbo Delphi für Win32
 
#1

Der Stack läuft über, der olle

  Alt 27. Sep 2005, 18:14
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?
Jan
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

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

  Alt 27. Sep 2005, 18:15
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
  Mit Zitat antworten Zitat
Eichhoernchen

Registriert seit: 22. Apr 2004
Ort: Hagen
322 Beiträge
 
Turbo Delphi für Win32
 
#3

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

  Alt 27. Sep 2005, 18:43
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?
Jan
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#4

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

  Alt 27. Sep 2005, 18:57
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

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

  Alt 27. Sep 2005, 19:17
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

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

  Alt 27. Sep 2005, 19:28
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)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

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

  Alt 27. Sep 2005, 19:42
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)
$2B or not $2B
  Mit Zitat antworten Zitat
Eichhoernchen

Registriert seit: 22. Apr 2004
Ort: Hagen
322 Beiträge
 
Turbo Delphi für Win32
 
#8

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

  Alt 27. Sep 2005, 19:51
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.
Jan
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#9

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

  Alt 27. Sep 2005, 19:58
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.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

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

  Alt 27. Sep 2005, 20:07
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort


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 09:33 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