AGB  ·  Datenschutz  ·  Impressum  







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

Stack-Überlauf

Ein Thema von Moyyer · begonnen am 4. Sep 2003 · letzter Beitrag vom 4. Sep 2003
Antwort Antwort
Moyyer

Registriert seit: 31. Mai 2003
155 Beiträge
 
Delphi 7 Enterprise
 
#1

Stack-Überlauf

  Alt 4. Sep 2003, 19:08
Hallo Alle Zusammen
ich habe hier eine Procedure aus meinem kartenspiel

Code:
procedure TForm1.naechsterspieler(spieler, wieviel, welchezahl: integer);
var c, d, wie: integer;
    a: array [1..8] of integer;
    kleft: integer;
begin
if spieler = 1 then spielerzug(viel, zahl) else
 begin
   wieviel := viel;
   kleft := mitte;
   for c := 0 to 7 do begin if lb[spieler].Items.Strings[c][2] = '1' then a[1] := a[1] + 1;
                            if lb[spieler].Items.Strings[c][2] = '2' then a[2] := a[2] + 1;
                            if lb[spieler].Items.Strings[c][2] = '3' then a[3] := a[3] + 1;
                            if lb[spieler].Items.Strings[c][2] = '4' then a[4] := a[4] + 1;
                            if lb[spieler].Items.Strings[c][2] = '5' then a[5] := a[5] + 1;
                            if lb[spieler].Items.Strings[c][2] = '6' then a[6] := a[6] + 1;
                            if lb[spieler].Items.Strings[c][2] = '7' then a[7] := a[7] + 1;
                            if lb[spieler].Items.Strings[c][2] = '8' then a[8] := a[8] + 1;
                      end;

   for d := 1 to 8 do
                     if (a[d] = wie) and (d >= welchezahl) then
                         begin showmessage('Der Spieler ' + inttostr(spieler) + ' wird mit ' + inttostr(d) + ' legen.');
                               label7.Caption := inttostr(d);
                               for c := 0 to 7 do
                               if lb[spieler].Items.Strings[c][2] = inttostr(d) then
                                    begin k[(spieler * 8) - (7 - c)].Left := kleft;
                                          kleft := kleft + 15;
                                          k[(spieler * 8) - (7 - c)].top := mitte1;
                                          lb[spieler].Items.Strings[c] := ' ';
                                          labels[spieler].Caption := 'Hat ' + inttostr(wie) + inttostr(d) + ' gelegt';
                                    end;
                                          spieler := spieler + 1;
                                          if spieler > 4 then
spieler := 2;
                                          naechsterspieler(spieler ,wie ,d + 1);
                                    end;



   end;
   label5.Caption := 'spieler kann nicht legen';
   spieler := spieler + 1;
   if spieler > 4 then spieler := 2;
   naechsterspieler(spieler ,wie ,d + 1);
end;
Ich versuche mein Problem zu erklären:
Die oben angezeigte procedure sind die Computer-Spieler.

Doch es kommt immer zu einem sogennanten Stack-Überlauf.
Was ist das? Wie kann ich es beheben? wo liegt der Fehler?
Wodurch wird es verurscht?
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#2

Re: Stack-Überlauf

  Alt 4. Sep 2003, 19:11
Überprüfe deine Rekursionsabrüche.

Für eine genaue Analyse des Problemes ist mir der Code zu wurchtelig.
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Moyyer

Registriert seit: 31. Mai 2003
155 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Stack-Überlauf

  Alt 4. Sep 2003, 19:22
Was sind Rekursionsabbrüche?
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#4

Re: Stack-Überlauf

  Alt 4. Sep 2003, 19:28
Rekursion: ist wenn sich eine Funktion in sich selbst ruft.

Rekursionsabrüche sind demnach die ausstiegspunkte aus der Endlosschleife.
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#5

Re: Stack-Überlauf

  Alt 4. Sep 2003, 19:31
Stacküberlauf:
Deine lokalen Variablen werden, während eine Andere Funktion ausgeführt wird, auf dem Stack gespeichert.
Der ist irgentwann voll!
Zu viele Rekursionen oder Schachtelungen!

Das letzte kenn ich nur noch aus DOS-Zeiten. Da heute in der Windows-Welt der Stack größer als 64k ist.
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  Mit Zitat antworten Zitat
Moyyer

Registriert seit: 31. Mai 2003
155 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Stack-Überlauf

  Alt 4. Sep 2003, 19:37
Die Variable "wieviel" darf den wert 8 nicht überschreiten.
wenn ich ganz am anfang der procedure den folgenden code einsetze.

Code:
if wieviel > 8 then exit;
wäre das so ein rekursionsabbruch?
aber das hab ich probiert und es half nicht.
  Mit Zitat antworten Zitat
Moyyer

Registriert seit: 31. Mai 2003
155 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Stack-Überlauf

  Alt 4. Sep 2003, 19:41
entschuldigung; die variable heißt "welche zahl"
(Diese Variable gibt die Karte an welche gerade liegt
1 = 7, 2 = 8, 3 = 9, 4 = Bube, ..., 8 = Ass)
  Mit Zitat antworten Zitat
neolithos

Registriert seit: 31. Jul 2003
Ort: Dresden
1.386 Beiträge
 
Delphi 7 Architect
 
#8

Re: Stack-Überlauf

  Alt 4. Sep 2003, 19:45
Ich mach jetzt Feierabend! Bis Morgen!

Du kannst ja mal deinen Code ordentlich Formatieren so das ein Fremder auch durchsieht.
Dann schau mal sofern der Fehler noch nicht gefunden die ganze sache noch mal an!
- ciao neo -
Es gibt niemals dumme Fragen, sondern nur dumme Antworten!
  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:31 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