AGB  ·  Datenschutz  ·  Impressum  







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

Stack Überlauf...aber warum???

Ein Thema von rumba · begonnen am 27. Mai 2013 · letzter Beitrag vom 27. Mai 2013
Antwort Antwort
rumba

Registriert seit: 19. Feb 2013
4 Beiträge
 
#1

Stack Überlauf...aber warum???

  Alt 27. Mai 2013, 10:10
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.

Geändert von TBx (27. Mai 2013 um 11:43 Uhr) Grund: Code-Tags in Delphi-Tags geändert
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Stack Überlauf...aber warum???

  Alt 27. Mai 2013, 10:19
Hallo,

kannst Du bitte mal die Prozedur positionieren posten?
Arbeitet diese rekursiv?

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
rumba

Registriert seit: 19. Feb 2013
4 Beiträge
 
#3

AW: Stack Überlauf...aber warum???

  Alt 27. Mai 2013, 10:20
Hallo Klaus,

wenn ich wüsste was Du meinst, würde ich es tuen
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Stack Überlauf...aber warum???

  Alt 27. Mai 2013, 10:22
.. die verwendest die Prozedur "positionieren" in Deiner SpeedButton3Click Methode.
Diese Prozedur zu sehen wäre vielleicht hilfreich.

Rekursision:
Ein Methode/Prozedur die sich selber aufruft bis eine bestimmte Abbruchbedingung erfüllt ist.

Grüße
Klaus
Klaus

Geändert von Klaus01 (27. Mai 2013 um 10:27 Uhr)
  Mit Zitat antworten Zitat
rumba

Registriert seit: 19. Feb 2013
4 Beiträge
 
#5

AW: Stack Überlauf...aber warum???

  Alt 27. Mai 2013, 10:26
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;

Geändert von TBx (27. Mai 2013 um 11:44 Uhr) Grund: Code-Tags durch Delphi-Tags ersetzt
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#6

AW: Stack Überlauf...aber warum???

  Alt 27. Mai 2013, 10:35
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:
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
 ...
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.
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
rumba

Registriert seit: 19. Feb 2013
4 Beiträge
 
#7

AW: Stack Überlauf...aber warum???

  Alt 27. Mai 2013, 10:40
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
  Mit Zitat antworten Zitat
CarlAshnikov

Registriert seit: 18. Feb 2011
Ort: Erfurt
108 Beiträge
 
Delphi XE5 Enterprise
 
#8

AW: Stack Überlauf...aber warum???

  Alt 27. Mai 2013, 10:51
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.
Sebastian
  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 18:41 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