AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Stacküberlauf bei Array einer Struktur >2000 Elemente
Thema durchsuchen
Ansicht
Themen-Optionen

Stacküberlauf bei Array einer Struktur >2000 Elemente

Ein Thema von DelphiManiac · begonnen am 26. Nov 2008 · letzter Beitrag vom 26. Nov 2008
Antwort Antwort
Seite 1 von 2  1 2      
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#1

Stacküberlauf bei Array einer Struktur >2000 Elemente

  Alt 26. Nov 2008, 12:31
Hallo ich habe eine Struktur:


Delphi-Quellcode:
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;
Das sind ja schoneinmal 32 Byte pro Record.

Jetzt brauche ich das 8192 mal.
Also habe ich mir eine Array angelegt:

  Datensaetze: array[0..8191] of TDatensatz; Wenn ich nun durchiteriere und die Datensätze befülle bekomme ich einen Stack Überlauf.

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
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#2

Re: Stacküberlauf bei Array einer Struktur >2000 Elemente

  Alt 26. Nov 2008, 12:33
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ß)
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Stacküberlauf bei Array einer Struktur >2000 Elemente

  Alt 26. Nov 2008, 12:37
Hi,

Zitat:
MesstellenBez:ShortString; // 16 Byte
ein Shortstring belegt 2 bis 256 Bytes, je nach Länge des Strings
Gruß
Norman
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.421 Beiträge
 
Delphi 12 Athens
 
#4

Re: Stacküberlauf bei Array einer Struktur >2000 Elemente

  Alt 26. Nov 2008, 12:38
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);
  ...
Uwe Raabe
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#5

Re: Stacküberlauf bei Array einer Struktur >2000 Elemente

  Alt 26. Nov 2008, 12:42
@NormanNG

MesstellenBez:ShortString; // 16 Byte 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.

@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.
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#6

Re: Stacküberlauf bei Array einer Struktur >2000 Elemente

  Alt 26. Nov 2008, 12:51
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
  Mit Zitat antworten Zitat
Horst_

Registriert seit: 22. Jul 2004
Ort: Münster Osnabrück
116 Beiträge
 
#7

Re: Stacküberlauf bei Array einer Struktur >2000 Elemente

  Alt 26. Nov 2008, 12:53
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.
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#8

Re: Stacküberlauf bei Array einer Struktur >2000 Elemente

  Alt 26. Nov 2008, 12:58
Also der Stacküberlauf kommt direkt beim Aufrufen der Button-Prozedur:

Delphi-Quellcode:
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);
Aber mit dem dynamischen Array nicht:

Delphi-Quellcode:
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);
Ihr habt recht mit dem Shortstring belegt also wirklich 256 Byte:

Zitat:
Ein ShortString hat eine Länge von 0 bis 255 Zeichen. Obwohl sich seine Länge dynamisch ändern kann, beträgt die statische Speicherplatzzuweisung immer 256 Bytes. Im ersten Byte wird die Länge des Strings gespeichert, die restlichen 255 Byte stehen für die Zeichen zur Verfügung
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Stacküberlauf bei Array einer Struktur >2000 Elemente

  Alt 26. Nov 2008, 12:58
Bei dynamischen arrays wird der Inhalt auch getrennt gespeichert
Markus Kinzler
  Mit Zitat antworten Zitat
DelphiManiac

Registriert seit: 5. Dez 2005
742 Beiträge
 
#10

Re: Stacküberlauf bei Array einer Struktur >2000 Elemente

  Alt 26. Nov 2008, 13:01
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.
  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 23:52 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