AGB  ·  Datenschutz  ·  Impressum  







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

Stack Überlauf

Ein Thema von S11 · begonnen am 16. Sep 2006 · letzter Beitrag vom 17. Sep 2006
Antwort Antwort
S11

Registriert seit: 21. Jan 2005
5 Beiträge
 
#1

Stack Überlauf

  Alt 16. Sep 2006, 22:24
Hallo,

vielleicht kann mir wer helfen. Irgendwie fällt mir momentan nix sinnvolles ein. Ich möchte eigentlich das der Buffer so groß ist, wie die Datei die ich öffne. Leider kommt es beim Vergrößern der Konstanten size über den momentanen Wert immer zu einem Stack Überlauf.

Delphi-Quellcode:
const
  size = 1010000;
var
  filestream: tfilestream;
  buffer: array[0..size] of byte;

  filestream := TFileStream.Create(file, fmOpenReadWrite);
  filestream.Read(buffer, size);
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Stack Überlauf

  Alt 16. Sep 2006, 22:29
heißt deine Variable für den Dateinamen wirklich "file"? wenn ja würde ich dort ansetzen. Eventuell macht der compiler was komisches weil es ein reservierter Ausdruck/Typ ist.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

Re: Stack Überlauf

  Alt 16. Sep 2006, 22:29
Der Stack ist standardmäßig auf 1 MB begrenzt, damit Endlosrekursionen mit der "Notbremse" gestoppt werden können. Wenn du nun eine so große Variable auf dem Stack anlegst (lokale Variablen sind immer auf dem Stack), dann geht das halt nicht. Deswegen sollte man in deinem Fall eher auf ein dynamische Array zurückgreifen.

Delphi-Quellcode:
const
  size = 1010000;
var
  filestream: TFileStream;
  buffer: array of byte;

  filestream := TFileStream.Create(file, fmOpenReadWrite);
  SetLength(buffer, size); // genug Speicher reservieren, die Freigabe übernimmt Delphi für dich
  filestream.Read(buffer[0], size); // hier immer das erste Zeichen angeben (außer bei .NET)
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Stack Überlauf

  Alt 16. Sep 2006, 22:32
Moin S11,

schreib es mal so:

filestream.Read(buffer[0], size); Wenn Du nicht auf den ersten Wert [0] zugreifst, schreibst Du nicht in den Buffer sondern überschreibst den Wert der Variablen und alles was dahinter steht.
(das ist, glaube ich, der "beliebteste" (häufigste) Fehler beim TFileStream )
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
S11

Registriert seit: 21. Jan 2005
5 Beiträge
 
#5

Re: Stack Überlauf

  Alt 16. Sep 2006, 22:42
wow, vielen Dank für die schnellen Antworten. Ich bin echt begeistert. Es funktioniert jetzt der Tipp mit dem dynamischen Array war genau das richtige. Danke jbg und auch SirThornberry und Christian Seehase.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

Re: Stack Überlauf

  Alt 17. Sep 2006, 11:47
Zitat von Christian Seehase:
Wenn Du nicht auf den ersten Wert [0] zugreifst, schreibst Du nicht in den Buffer sondern überschreibst den Wert der Variablen und alles was dahinter steht.
(das ist, glaube ich, der "beliebteste" (häufigste) Fehler beim TFileStream )
Bei statischen Arrays ist kein Unterschied zwischen @buffer und @buffer[0]. Bei dynamischen jedoch schon.
  Mit Zitat antworten Zitat
Antwort Antwort


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 04:32 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