AGB  ·  Datenschutz  ·  Impressum  







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

Stack Überlauf

Ein Thema von Stöffi · begonnen am 20. Feb 2007 · letzter Beitrag vom 20. Feb 2007
Antwort Antwort
Stöffi

Registriert seit: 18. Feb 2007
Ort: Wiebelskirchen
6 Beiträge
 
Delphi 5 Standard
 
#1

Stack Überlauf

  Alt 20. Feb 2007, 16:05
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??
  Mit Zitat antworten Zitat
Benutzerbild von inherited
inherited

Registriert seit: 19. Dez 2005
Ort: Rosdorf
2.022 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Stack Überlauf

  Alt 20. Feb 2007, 16:09
Der Überlauf kann durch mehrere Dinge ausgelöst werden.
Nur der Kopf der Funktion reicht nicht, du musst schon mehr Preisgeben.
Nikolai Wyderka

SWIM SWIM HUNGRY!
Neuer Blog: hier!
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.639 Beiträge
 
#3

Re: Stack Überlauf

  Alt 20. Feb 2007, 16:11
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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Cöster

Registriert seit: 6. Jun 2006
589 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Stack Überlauf

  Alt 20. Feb 2007, 16:13
Da du nur einen kleinen Teil der Prozedur gepostet hast, kann ich erstmal nur raten und sage: Endlosrekursion

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.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Stack Überlauf

  Alt 20. Feb 2007, 16:18
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.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
20. Feb 2007, 18:49
Dieses Thema wurde von "r_kerber" von "Programmieren allgemein" nach "Object-Pascal / Delphi-Language" verschoben.
Ist ein Delphi-Thema
Benutzerbild von inherited
inherited

Registriert seit: 19. Dez 2005
Ort: Rosdorf
2.022 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Stack Überlauf

  Alt 20. Feb 2007, 20:02
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.
Nikolai Wyderka

SWIM SWIM HUNGRY!
Neuer Blog: hier!
  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 06:48 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