![]() |
Stacküberlauf bei Array einer Struktur >2000 Elemente
Hallo ich habe eine Struktur:
Delphi-Quellcode:
Das sind ja schoneinmal 32 Byte pro Record.
type
TDatensatz = record MesstellenNr:Byte; MesstellenBez:ShortString; // 16 Byte Tag:Byte; Monat:Byte; Jahr:Byte; Stunde:Byte; Minute:Byte; Status:Word; O2:Word; O2Unit:Byte; Temp:Word; Stoerung:Byte; ADC_V_Bat:Word; end; Jetzt brauche ich das 8192 mal. Also habe ich mir eine Array angelegt:
Delphi-Quellcode:
Wenn ich nun durchiteriere und die Datensätze befülle bekomme ich einen Stack Überlauf.
Datensaetze: array[0..8191] of TDatensatz;
Das müssten dann ungefähr 256 KByte sein, wenn ich richtig gerechnet habe. Warum bekomme ich denn einen Stacküberlauf? Vielen Dank Gruß DelphiManiac |
Re: Stacküberlauf bei Array einer Struktur >2000 Elemente
hat wohl was mit der stack-größe zu tun, aber da kann ich dir nicht weiterhelfen.
mit einer verketteten liste und objekten solltest dieses problem nicht bekommen! (wenn ich das noch richtig weiß) |
Re: Stacküberlauf bei Array einer Struktur >2000 Elemente
Hi,
Zitat:
|
Re: Stacküberlauf bei Array einer Struktur >2000 Elemente
Soweit ich weiß, ist ShortString als string[255] deklariert.
Und grundsätzlich sollte man derart große Strukturen nicht auf dem Stack anlegen. Eine Möglichkeit ist, das Array dynamisch anzulegen:
Delphi-Quellcode:
var
DatenSaetze: array of TDatensatz; begin SetLength(DatenSaetze, 8192); ... |
Re: Stacküberlauf bei Array einer Struktur >2000 Elemente
@NormanNG
Delphi-Quellcode:
Ich belege nur 16 Byte des Strings, jetzt weiß ich nicht genau, wie es im Speicher abgelegt wird, bin davon ausgegangen, das nur 16 Byte belegt werden, kann mich aber täuschen.
MesstellenBez:ShortString; // 16 Byte
@Uwe Raabe: Macht es denn wirklich einen Unterschied ob ich die dynamisch oder statisch anlege? Kann es ja mal probieren, beim dynamischen anlegen, werden die Elemente glaube ich auf den Heap geschoben, lasse mich aber gerne eines besseren belehren. Ich probiere es mal. |
Re: Stacküberlauf bei Array einer Struktur >2000 Elemente
Mit einem dynamisch angelegten Array hat man diese Probleme anscheinend wirklich nicht.
Vielleicht kann ja mal jemand kurz einen Einblick geben, warum das so ist. Viele Grüße und vielen Dank DelphiManiac |
Re: Stacküberlauf bei Array einer Struktur >2000 Elemente
Hallo,
wie iterierst Du beim befüllen, was wird dort verarbeitet. 256 Kbyte sind locker möglich. Selbst wenn der shortstring ersteinmal 256 Byte belegt. shortstring[16] belegte auch 17 byte. Es schätze es ist was anderes, irgendwelche Stringverarbeitungen die Speicherplatz belegen und erst sehr spät wieder freigegeben werden. Gruß Horst EDIT: mit dynamischem array geht es? mysteriös. |
Re: Stacküberlauf bei Array einer Struktur >2000 Elemente
Also der Stacküberlauf kommt direkt beim Aufrufen der Button-Prozedur:
Delphi-Quellcode:
Aber mit dem dynamischen Array nicht:
procedure TfrmDatalogGUI.btnLadenClick(Sender: TObject);
var I: Integer; xlsFile : TXLSFile; template:string; sprache:Integer; Datensaetze: array[0..8192] of TDatensatz; Datum:TDate; Uhrzeit:TTime; Expo:Smallint; O2Einheit:string; EndOfDataRead:Integer; error:integer; begin // <------------------ Hier knallts dann sofort (nachdem die Variablen deklariert worden sind) // SetLength(Datensaetze,8192);
Delphi-Quellcode:
Ihr habt recht mit dem Shortstring belegt also wirklich 256 Byte:
procedure TfrmDatalogGUI.btnLadenClick(Sender: TObject);
var I: Integer; xlsFile : TXLSFile; template:string; sprache:Integer; Datensaetze: array of TDatensatz; Datum:TDate; Uhrzeit:TTime; Expo:Smallint; O2Einheit:string; EndOfDataRead:Integer; error:integer; begin SetLength(Datensaetze,8192); Zitat:
|
Re: Stacküberlauf bei Array einer Struktur >2000 Elemente
Bei dynamischen arrays wird der Inhalt auch getrennt gespeichert
|
Re: Stacküberlauf bei Array einer Struktur >2000 Elemente
D.h. nicht zwingend hintereinander? Sondern im Speicher verteilt.
Klingt ja auch logisch, schließlich kann das Programm auch nicht wissen um wie viele Elemente das Array vergrößert wird. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 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 by Thomas Breitkreuz