AGB  ·  Datenschutz  ·  Impressum  







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

Stack Überlauf

Ein Thema von Leena · begonnen am 6. Nov 2008 · letzter Beitrag vom 7. Nov 2008
Antwort Antwort
Seite 1 von 2  1 2      
Leena

Registriert seit: 6. Nov 2008
4 Beiträge
 
Delphi 7 Personal
 
#1

Stack Überlauf

  Alt 6. Nov 2008, 14:35
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?
Maria
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.337 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Stack Überlauf

  Alt 6. Nov 2008, 14:53
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
  Mit Zitat antworten Zitat
Leena

Registriert seit: 6. Nov 2008
4 Beiträge
 
Delphi 7 Personal
 
#3

Re: Stack Überlauf

  Alt 6. Nov 2008, 15:32
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?
Maria
  Mit Zitat antworten Zitat
Frankfurtoder

Registriert seit: 27. Mär 2008
112 Beiträge
 
RAD-Studio 2010 Pro
 
#4

Re: Stack Überlauf

  Alt 6. Nov 2008, 15:39
Wo ist a deklariert?

edit: Und n?

edit: vesprochen^^
Erik
Alles gut?
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#5

Re: Stack Überlauf

  Alt 6. Nov 2008, 15:43
Hallo Leena,

willkommen im Club der Delphianer

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

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

Registriert seit: 27. Mär 2008
112 Beiträge
 
RAD-Studio 2010 Pro
 
#6

Re: Stack Überlauf

  Alt 6. Nov 2008, 15:48
Aber muss nicht der Datentyp festgelegt werden von a sowie n? oder sind die variablen public/private?
Erik
Alles gut?
  Mit Zitat antworten Zitat
Leena

Registriert seit: 6. Nov 2008
4 Beiträge
 
Delphi 7 Personal
 
#7

Re: Stack Überlauf

  Alt 6. Nov 2008, 15:55
@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.
Maria
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.337 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Stack Überlauf

  Alt 6. Nov 2008, 16:28
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...
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#9

Re: Stack Überlauf

  Alt 6. Nov 2008, 16:30
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).
  Mit Zitat antworten Zitat
Leena

Registriert seit: 6. Nov 2008
4 Beiträge
 
Delphi 7 Personal
 
#10

Re: Stack Überlauf

  Alt 6. Nov 2008, 17:18
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.
Maria
  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 01:06 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