Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Stack Überlauf (https://www.delphipraxis.net/123680-stack-ueberlauf.html)

Leena 6. Nov 2008 14:35


Stack Überlauf
 
Hallo,
ich habe folgendes Problem:

Mein Programm enthält mehrere dynamische Arrays, denen ich mit setLength() eine Größe zuweise. Das klapt zunächst auch, aber sobalt ich versuche die Arraygröse im nachhinein mit dem selben Befehl zu verändern bekomme ich die Meldung Stack Überlauf. Die selbe Meldung bekomme ich wenn ich das Programm beende.

Wenn ich die anderen Forumsbeiträge zum Thema Stack Überlauf richtig verstanden habe geht es bei der Meldung ja darum das ein Speicher voll ist, aber wie kann ein Speicher überlaufen wenn ich ein Array verkleinere oder das Programm beende? :gruebel:

stahli 6. Nov 2008 14:53

Re: Stack Überlauf
 
Hallo Leena,

willkommen im besten Delphi-Forum der Welt :-)

Ein Stack-Überlauf deutet eigentlich auf einen rekursiven Aufruf, der nicht unterbrochen wird.

procedure A;
begin
A;
end;

Ich denke nicht, dass Dein Problem durch SetLength direkt ausgelöst wird, sondern durch eine andere Funktion, die Du parallel ausführst (z.B. Freigeben von Objekten oder ähnlichem). Das würde auch dazu passen, dass das Problem auch beim Beenden des Programms auftritt...


stahli

Leena 6. Nov 2008 15:32

Re: Stack Überlauf
 
Danke für den Hinweis.
Allerdings finde ich an der Stelle keine rekursive Prouedur.

Delphi-Quellcode:
procedure eingabe;
var i:integer;
begin
   If zahler1 = 0
   Then
   begin
     Form2.Label1.caption:='';
     Form2.Label3.caption:='';
     Form2.edit2.show;
     a:= strToInt(Form2.Edit1.Text);
     n:= 1;
     For i:=1 to a Do
     begin
         n:= n*a;
     end;
     setLength(El,a);
     setLength(Mo,n);
     setLength(Re,n,a);
     setLength(Vo,a);
     Form2.Edit1.Text:='';
   end;
end;
Auserdem müste es, bei einer rekursiven entlosschleife doch schon deim ersten Programmdurchlauf zu einem Fehler kommen, oder?

Frankfurtoder 6. Nov 2008 15:39

Re: Stack Überlauf
 
Wo ist a deklariert?

edit: Und n?

edit: vesprochen^^

nahpets 6. Nov 2008 15:43

Re: Stack Überlauf
 
Hallo Leena,

willkommen im Club der Delphianer :wink:

Ist das beabsichtigt?
Delphi-Quellcode:
setLength(Re,n,a);
setlength hat hier drei Parameter?

@Frankfurtoder
Delphi-Quellcode:
a:= strToInt(Form2.Edit1.Text);
n:= 1;

Frankfurtoder 6. Nov 2008 15:48

Re: Stack Überlauf
 
Aber muss nicht der Datentyp festgelegt werden von a sowie n? oder sind die variablen public/private?

Leena 6. Nov 2008 15:55

Re: Stack Überlauf
 
@Frankfurtoder:
n und a, sind genau wie die Arrays und zahler1 als globale Variablen am Programm Anfang deklariert.

@nahpets:
Ja, die drei Parameter für setLength sind absicht da es sich um ein zweidimensionales Array handelt.

stahli 6. Nov 2008 16:28

Re: Stack Überlauf
 
Zitat:

Auserdem müste es, bei einer rekursiven entlosschleife doch schon deim ersten Programmdurchlauf zu einem Fehler kommen, oder?
Du meinst beim ersten Aufruf von "Eingabe"? Das ist richtig - wenn Eingabe eine rekursive Prozedur wäre.

Also wird das Problem weiter außen liegen. Von wo aus wird denn "Eingabe" überall aufgerufen? Auich beim Programmende? Das lässt der Prozedurname aber eher nicht vermuten...

Setze doch mal einen Haltepunkt und schau Dir an, was vor und nach der Prozedur passiert...

nahpets 6. Nov 2008 16:30

Re: Stack Überlauf
 
Hallo,

zeig' uns doch bitte mal den kompletten Quelltext.
Wo wird eingabe aufgerufen, wie groß kann a sein?
Tritt der Fehler unabhängig davon, ob a 1 oder 1000000 oder irgendwas anderes ist, auf?
Von welchem Typ sind ElMoReVo?
Auch bei relativ kleinem a kann die Größe der Arrays schon ziemlich "heftig" werden.

Bei a = 2 hat Re 4*2 Elemente, bei a = 3 sind es 9*3, bei a = 10 sind's dann schon 10*10000000000, da könnte je nach Typ von Re der Speicher schon mal knapp werden. Selbst bei 'nem Byte pro Element hätte mein Rechner da schon lange Oberkante Unterlippe deutlich überschritten (hoffe, dass ich hier jetzt nicht vollständig falsch gerechnet habe).

Leena 6. Nov 2008 17:18

Re: Stack Überlauf
 
Ich weis, die Arrays sind ziemlich groß, aber bis jetzt habe ich nur die Werte 2, 3 und 4 für a ausprobiert. Der Fehler tritt immer auf.

Aufgerufen wird die "eingabe" nur in der Prozedur Edit1KeyDown:
Delphi-Quellcode:
Me = Record
            zeit: Integer;
            doppelt: boolean;
         end;
Ar =  Record
            zeit, t: Integer;
         end;

var
  Form2: TForm2;
  El: Array of Ar;            
  Mo: Array of Me;      
  Re: Array of Array of Integer;
  Vo: Array of boolean;          
  a,n,zahler1: Integer;
 
procedure eingabe;
begin
 {...}
end;

procedure berechne;
begin
 {...}
end;

procedure TForm2.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 If Key =13
    Then
    begin
      eingabe;
      If (zahler1 = a+2)
      Then  berechne;
      zahler1:= zahler1+1;
    end;
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
   zahler1:=0;
end;


procedure TForm2.Form2Show(Sender: TObject);
begin
  zahler1:= 0;
end;

end.
Ein richtiges Programmende habe ich nicht programiert. Ich benutze einfach das Kreuz oben rechts um das Programm zu schliesen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:06 Uhr.
Seite 1 von 2  1 2      

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