![]() |
Stack Überlauf...aber warum???
Hallo zusammen,
ich bin neu hier und Delphi- Greenhorn. Ich bekomme immer einen Stack Überlauf und weiß nicht warum. Habe eine Procedure zum Löschen eines Datensatzes aus einer typisierten Datei. Es muss wohl am Array liegen, aber ich weiß nicht was ich anders machen soll. In einem anderen Fall habe ich das genau so gelöst....nur hier klappt es nicht...HILFE Hier der Code:
Delphi-Quellcode:
const BufferSize = 300; procedure TForm51.SpeedButton3Click(Sender: TObject); var Buffer : array[0..BufferSize -1] of Sdatensatz; i, StartRecord, EndRecord, Max: Integer; begin if MessageDlg('Möchten Sie wirklich das Strategiegespräch "' + edit1.Text + '" löschen?', mtWarning, [mbYes, mbNo], 0) = mrYes then begin //Datenzeiger wird vor den akt. Datensatz gesetzt seek (file3, Filepos(file3)-1); //starten mit dem ersten Datensatz hinter dem zu löschenden StartRecord := Filepos(file3)+1; EndRecord := Filesize(file3); //max. Buffersize Datensätze lesen Max := BufferSize; if Max > EndRecord - StartRecord then Max := EndRecord - StartRecord; seek (file3, StartRecord); for i := 0 to Max -1 do read(file3, Buffer[i]); //Datensätze zurückschreiben seek (file3, StartRecord -1); for i := 0 to Max -1 do write(file3, Buffer[i]); // Datei ab hier abschneiden Truncate(file3); positionieren(StartRecord-1); //Edits leeren edit1.text := ''; end; speedbutton3.Enabled := false; label17.Visible := true; label17.caption := 'Strategiegespräch '+ inttostr(filepos(file3))+ ' von ' + inttostr(filesize(file3)); end; end. |
AW: Stack Überlauf...aber warum???
Hallo,
kannst Du bitte mal die Prozedur positionieren posten? Arbeitet diese rekursiv? Grüße Klaus |
AW: Stack Überlauf...aber warum???
Hallo Klaus,
wenn ich wüsste was Du meinst, würde ich es tuen :-) |
AW: Stack Überlauf...aber warum???
.. die verwendest die Prozedur "positionieren" in Deiner SpeedButton3Click Methode.
Diese Prozedur zu sehen wäre vielleicht hilfreich. ![]() Ein Methode/Prozedur die sich selber aufruft bis eine bestimmte Abbruchbedingung erfüllt ist. Grüße Klaus |
AW: Stack Überlauf...aber warum???
Ahh, sorry...Montag...
Delphi-Quellcode:
procedure TForm51.positionieren(Sdaten : Integer);
var aktdatensatz : Sdatensatz; begin if (Sdaten<0) or (Sdaten>=Filesize(file3)) then exit else begin seek(file3, Sdaten); read(file3, aktdatensatz); edit1.Text := aktdatensatz.SpeichernAls; end; end; |
AW: Stack Überlauf...aber warum???
Okay, die ist nicht der Schuldige. Die Deklaration von Sdatensatz wäre dann interessant, weil wenn das zu groß ist, könnte in der Tat ein 300 Elemente langes Array davon den Stack überfordern. In dem Fall wäre ein Umbau auf ein dynamisches Array ggf. sinnvoll, die liegen nämlich dann auf dem Heap.
Delphi-Quellcode:
Lokale Variablen, sprich alles unter dem "var" der procedure landet erstmal pauschal auf dem Stack. Da Delphi bei einem dynamischen Array aber noch nicht weiss wie viel Speicher dafür zu veranschlagen ist, belegt es nur 4 Byte (einen Pointer) auf dem Stack, und die eigentlichen Array-Elemente werden nachher mit SetLength() im Heap erzeugt. Bei deinem statischen Array (also mit fester Längenangabe direkt bei der Deklaration) versucht Delphi das ganze Teil auf den Stack zu quetschen, der standardmäßig mit 1MB für sowas recht knapp ist.
const
BufferSize = 300; procedure TForm51.SpeedButton3Click(Sender: TObject); var Buffer: array of Sdatensatz; // Grenzen entfernt -> so ist es ein dynamisches Array i, StartRecord, EndRecord, Max: Integer; begin SetLength(Buffer, BufferSize); // Reserviert 300 Plätze, so dass es von aussen genau so wie das alte Array aussieht ... Man könnte jetzt natürlich auch in den Projektoptionen die Stackgröße aufbohren wie Hulle, das ist aber fast nie nötig, und auch nicht ganz sinnvoll. |
AW: Stack Überlauf...aber warum???
Hallo Medium,
vielen Dank für die Antwort. Habe es nun so umgesetzt und das Array dynamisch gestaltet. Besten Dank!! Es funktioniert! Vielen vielen Dank (auch an Klaus für die Hilfe)!! Wünsche euch noch einen schönen Tag |
AW: Stack Überlauf...aber warum???
Ich hätte noch ein paar allgemeine Tipps.
Beim Lesen ist es hilfreich Delphi Tags wegen dem Syntax highlighting zu nehmen und eine einheitliche Einrückung zu verwenden (Dann lesen sich wahrscheinlich mehr Leute deine Quelltext der Posts hier durch). Für die Wartbarkeit auf jeden Fall sinnvolle Namen vergeben ( edit1? Form51?). Ist nicht immer einfach aber momentan weißt du vielleicht noch was was ist, in ein paar Tagen sicher nicht mehr. Außerdem für die Arbeit mehrerer Personen am selben Code unabdingbar. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:59 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