Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#32

Re: Pokerprojekt realisierung

  Alt 4. Apr 2007, 12:52
Zitat von .chicken:
Und zwar:
"Project LAN_Poker raised exception class EStackOverflow with message 'Stack overflow'"
Das tritt auf, wenn Du eine Rekursion hast, die nicht abbricht. Der Stack ist ein Stapel, auf dem Du Dinge ablegst. Du legst einfach was oben rauf und merkst Dir die Reihenfolge. Beim Runternehmen gehst Du (wie bei jedem Stapel) andersherum vor, das was oben liegt kommt zuerst runter. Der wird für verschiedene Dinge benutzt, z.B. werden hier Dinge abgelegt, wenn eine Methode sich selbst aufruft. Beispiel wäre die Fakultät, n! ist ja gerade n * (n-1)!. Nimmst Du nur diese Formel, dann merkt sich Delphi n (auf dem Stack) und berechnet (n-1)!, für (n-1)! wird (n-1) gemerkt und ((n-1)-1)! berechnet. Das Problem auch hier, es gibt noch keinen Rekursionsanker (wann ist man fertig). Natürlich gibt es den bei der Fakultät, hier gilt dass 0! = 0 ist und/oder 1! = 1. Irgendwann wurde also ganz viel von n abgezogen, so dass Du die Fakultät von 1 berechnen kannst und die kennst Du. Dann springt der zurück und findet dort 2* (1!), 1! kennst Du nun und kannst das ausrechnen, springst zurück und hast 3 * (2!),... Das zurückspringen nimmt einfach die Daten wieder vom Stack runter.
Der Stack ist dabei ein Speicher mit einer max. Größe. Legst Du also nur lang genug was darauf ab, gibt es einen Stackoverflow. Die Grenze ist dabei sehr hoch gesetzt, kommt es zu einem Stackoverflow, liegt das i.d.R. wirklich am Programm!

Schau einfach mal, wo sich eine Prozedur selbst aufruft (oder Du sonst einen Kreis hast). Als Hilfe kannst Du einfach einen Breakpoint (diese roten Punkte/ F5) setzen. Dort hält Delphi dann an, wenn Du das Programm ausführst. Hier kannst Du nun mit F7 in die Ausführung reinspringen und siehst, was Dein Code gerade macht. Bei größeren Schleifen kann das nerven, hier kannst Du auch einfach auf die Zeile hinter die Schleife einen neuen Breakpoint setzen und mit F9 die Ausführung fortsetzen. Die geht normal weiter, bis das Programm endet, ein Fehler auftritt oder ein Breakpoint den Ablauf erneut unterbricht.
  Mit Zitat antworten Zitat