Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Stack Überlauf...aber warum??? (https://www.delphipraxis.net/175043-stack-ueberlauf-aber-warum.html)

rumba 27. Mai 2013 09:10

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.

Klaus01 27. Mai 2013 09:19

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

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

Grüße
Klaus

rumba 27. Mai 2013 09:20

AW: Stack Überlauf...aber warum???
 
Hallo Klaus,

wenn ich wüsste was Du meinst, würde ich es tuen :-)

Klaus01 27. Mai 2013 09:22

AW: Stack Überlauf...aber warum???
 
.. 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

rumba 27. Mai 2013 09:26

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;

Medium 27. Mai 2013 09:35

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:
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.

rumba 27. Mai 2013 09:40

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

CarlAshnikov 27. Mai 2013 09:51

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 17:37 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