Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Stack Überlauf (https://www.delphipraxis.net/86849-stack-ueberlauf.html)

Stöffi 20. Feb 2007 15:05


Stack Überlauf
 
Hallo

Beim Starten und Ausführen des Programms kommt es zu einem Stack Überlauf. Anbei die Prozedur bei der bei Beginn der Überlauf zustande kommt:


Delphi-Quellcode:
procedure Pruefe_NachbarC(Anzahl_C:integer; var AnzahlSub,Anzahl_sk:integer; i,j,zaehler:integer; var maxcstart:integer;
                                            var Anzahl_der_Cs_der_Kette,Index_laengste_C_Kette,Zaehler_der_gleichlangen_Ketten:integer; qhilf:integer);
var Z,k          :integer;
begin

Ich hoffe ihr könnt mir weiterhelfen.

PS: Wie und warum kommt ein Stack Überlauf überhaupt zustande??

inherited 20. Feb 2007 15:09

Re: Stack Überlauf
 
Der Überlauf kann durch mehrere Dinge ausgelöst werden.
Nur der Kopf der Funktion reicht nicht, du musst schon mehr Preisgeben.

Phoenix 20. Feb 2007 15:11

Re: Stack Überlauf
 
Zu 99% stammen Stack Überläufe daher, dass sich Methoden gegenseitig in einer Art Endlosschleife aufrufen. Dabei wird jeder Aufruf freilich auf den Callstack gepackt, und irgendwann läuft er halt über weil er nur eine endliche Größe hat.

Cöster 20. Feb 2007 15:13

Re: Stack Überlauf
 
Da du nur einen kleinen Teil der Prozedur gepostet hast, kann ich erstmal nur raten und sage: Endlosrekursion

Zitat:

Zitat von Stöffi
PS: Wie und warum kommt ein Stack Überlauf überhaupt zustande??

Bei jedem Methoden-Aufruf wird die Adresse der Codezeile, bei der nach Beendigung der aufgerufenen Methode weitergelesen wird. Das heißt, immer wenn eine Methode aufgerufen wird, wird eine Adresse auf dem Stack abgelegt. Der Arbeitsspeicher (in dem sich der Stack befindet) hat aber nunmal auch nur eine beschränkte größe. Wenn eine Methode sich selbst also immer wieder selbst aufruft (Rekursion), ohne abzubrechen, kommt es zu einem Stacküberlauf.

sirius 20. Feb 2007 15:18

Re: Stack Überlauf
 
Zitat:

Zitat von Cöster
Bei jedem Methoden-Aufruf wird die Adresse der Codezeile, bei der nach Beendigung der aufgerufenen Methode weitergelesen wird. Das heißt, immer wenn eine Methode aufgerufen wird, wird eine Adresse auf dem Stack abgelegt. Der Arbeitsspeicher (in dem sich der Stack befindet) hat aber nunmal auch nur eine beschränkte größe. Wenn eine Methode sich selbst also immer wieder selbst aufruft (Rekursion), ohne abzubrechen, kommt es zu einem Stacküberlauf.

Und das gnaze wird auch noch beschleunigt, da lokale Variablen zumeist auch auf den Stack gelegt werden.

DP-Maintenance 20. Feb 2007 17:49

DP-Maintenance
 
Dieses Thema wurde von "r_kerber" von "Programmieren allgemein" nach "Object-Pascal / Delphi-Language" verschoben.
Ist ein Delphi-Thema

inherited 20. Feb 2007 19:02

Re: Stack Überlauf
 
Schön deutlich wird das, sobald du mal einen Emulator schreibst, so wie ich das mache. Bei Chip8 beispielsweise wird der Stack ausschließlich für das Speichern der Rücksprungadressen benutzt, damit ich weiß, wohin ich muss, sobald eine Funktion zu Ende ist.
jedesmal wenn eine Funktion aufgerufen wird, speichert man die Adresse auf den Stack und setzt den Stackpointer ein Element weiter. Da man allerdings nicht unendlich Platz hat, stößt dieser irgendwann an seine grenzen, wenn zuviele Funktionen aufgerufen werden. Dann krachts. Kompliziertere hngegen verwenden den Stack außerdem für andere Sachen zusätzlich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:48 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