![]() |
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:
Daten ist vom Typ TOrte und speichert die einzelnen Positionen aller Orte:
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;
Delphi-Quellcode:
Das Programm soll Spur der Personen speichern, hat auch wunderbar geklappt.
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 Jetzt hab ich noch eine eigene Klasse gebaut, die Datengruppe, um das Programm noch etwas zu verallgemeinern:
Delphi-Quellcode:
somit mussste ich nur noch die Procedure noch verallgemeinern:
TDatengruppe = record
Daten:array[0..1000]of TOrte; Personenanzahl: integer; end; ... var Form1: TForm1; Datengruppe1:Tdatengruppe
Delphi-Quellcode:
Aufrufen der Procedure mit Button:
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;
Delphi-Quellcode:
Jetzt kommt plötzlich ein Stack-overflow, wenn ich diese procedure ausfühern will!! warum?? :gruebel: :( :pale: :kotz:
procedure TForm1.Button1Click(Sender: TObject);
begin Spurzeichnen(image1,datengruppe1) end Ich habe doch eigentlich nichts verändert! |
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). |
Re: Stack overflow
Das erschreckt mich jetzt. Wie kann ich das anders programmieren?
|
Re: Stack overflow
Zitat:
Delphi-Quellcode:
procedure tform1.Spurzeichnen(image:timage, const Datengruppe: Tdatengruppe);
|
Re: Stack overflow
Und auf Dauer unbedingt dein Design auf dynamische Arrays umstellen.
|
Re: Stack overflow
Vielen Dank! Das funktioniert. ich wusste nicht, dass da das ganze System kopiert wird! :spin:
|
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