Delphi-PRAXiS

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

vsilverlord 15. Jun 2008 15:14


Stack overflow
 
Hallihallo, also ich hab hier so ein Problem.
Zuerst hatte ich eine ganz normale eigene procedure, die sah ungefähr so aus.
Delphi-Quellcode:
procedure tform1.Spurzeichnen(image:timage);
var
i,s,x,y:integer;
begin
i:=1;
s:=0;
while i <= Personenanzahl do
begin
  x:=Daten[i].Ort[0].x;
  y:=Daten[i].Ort[0].y;
  image.Canvas.MoveTo(x,y);
  s:=1;
   while s <= Daten[i].Anzahl do
      begin
         x:=Daten[i].Ort[s].x;
         y:=Daten[i].Ort[s].y;
         image.Canvas.LineTo(x,y);
         s:=s+1;
      end;
  i:=i+1;
end
end;
Daten ist vom Typ TOrte und speichert die einzelnen Positionen aller Orte:
Delphi-Quellcode:
TOrte = record
    Ort:array[0..1000]of Tpoint;
    Anzahl: integer; //Anzahl der Schritte
end;
...
var
Form1: TForm1;
Daten:array[0.1000]of TOrte;
Personenanzahl:integer
Das Programm soll Spur der Personen speichern, hat auch wunderbar geklappt.
Jetzt hab ich noch eine eigene Klasse gebaut, die Datengruppe, um das Programm noch etwas zu verallgemeinern:
Delphi-Quellcode:
TDatengruppe = record
      Daten:array[0..1000]of TOrte;
      Personenanzahl: integer;
end;
...
var
Form1: TForm1;
Datengruppe1:Tdatengruppe
somit mussste ich nur noch die Procedure noch verallgemeinern:
Delphi-Quellcode:
procedure tform1.Spurzeichnen(image:timage,Datengruppe:Tdatengruppe);
var
i,s,x,y:integer;
begin
i:=1;
s:=0;
while i <= Datengruppe.Personenanzahl do
begin
  x:=Datengruppe.Daten[i].Ort[0].x;
  y:=Datengruppe.Daten[i].Ort[0].y;
  image.Canvas.MoveTo(x,y);
  s:=1;
   while s <= Datengruppe.Daten[i].Anzahl do
      begin
         x:=Datengruppe.Daten[i].Ort[s].x;
         y:=Datengruppe.Daten[i].Ort[s].y;
         image.Canvas.LineTo(x,y);
         s:=s+1;
      end;
  i:=i+1;
end
end;
Aufrufen der Procedure mit Button:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
Spurzeichnen(image1,datengruppe1)
end
Jetzt kommt plötzlich ein Stack-overflow, wenn ich diese procedure ausfühern will!! warum?? :gruebel: :( :pale: :kotz:
Ich habe doch eigentlich nichts verändert!

Bernhard Geyer 15. Jun 2008 15:23

Re: Stack overflow
 
Ein Record vom Typ TOrte benötigt: 1001 * 2 * 4 Byte = 8008 Byte
Ein Record vom Typ TDatengruppe benötigt: 8008 Byte * 1001 + 4 Byte = 8016012 Byte.

So wie du diese Records verwendest wird beim Aufruf der Funktion diese ca. 8 MB große Record kopiert (!) und auf dem Stack gelegt. Und im Normalfall ist bei einem Projekt die Stackgröße nicht so hoch (Kann in den Projektoptionen verändert werden).

vsilverlord 15. Jun 2008 15:42

Re: Stack overflow
 
Das erschreckt mich jetzt. Wie kann ich das anders programmieren?

Bernhard Geyer 15. Jun 2008 15:45

Re: Stack overflow
 
Zitat:

Zitat von vsilverlord
Das erschreckt mich jetzt. Wie kann ich das anders programmieren?

Fürs erste ein Const ergänzen umd das kopieren der Daten zu verhindern.

Delphi-Quellcode:
procedure tform1.Spurzeichnen(image:timage, const Datengruppe: Tdatengruppe);

Apollonius 15. Jun 2008 15:56

Re: Stack overflow
 
Und auf Dauer unbedingt dein Design auf dynamische Arrays umstellen.

vsilverlord 15. Jun 2008 15:56

Re: Stack overflow
 
Vielen Dank! Das funktioniert. ich wusste nicht, dass da das ganze System kopiert wird! :spin:

vsilverlord 15. Jun 2008 15:57

Re: Stack overflow
 
Kannst du mir da bitte für mein Programm ein Beispiel machen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:49 Uhr.

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