Stack Overflow



  • Hey,
    ich habe fogendes Problem und zwar versuche ich so eine Art Minesweeper für die Konsole zu programmieren.
    Wenn der Anwender ein Feld aufdeckt, um das herum keine Mine ist, möchte ich aber keine 0 ausgeben, sondern einen ganzen Bereich aufdecken, wie bei Minesweeper eben.

    Leider fuktioniert meine dafür verwendete Rekursion nicht. Bei der Ausführung gibt es einen Stack Overflow. Ich verstehe nur nicht ganz warum. Wiederholt sich die Rekursion etwa unendlich mal, sodass irgendwann der Stack voll ist?

    void System::ausbreitung(const int &y, const int &x)
    {
    	if(im_Wertebereich(y,x))
    	{
    		int zahl=0;
    		for(int i = -1;i < 2;i++)
    		{
    			for(int j = -1;j < 2;j++)
    			{
    				if(im_Wertebereich(y+i,x+j))
    				{
    					zahl = zaehleMine(y+i,x+j);
    
    					if(zahl == 0)
    					{
    						koordinatensystem[y+i][x+j] = ' ';
    						ausbreitung(y+i,x+j);
    					}
    					else
    					{
    						koordinatensystem[y+i][x+j] = (char)('0' + zahl);
    					}
    				}
    			}
    		}
    	}
    }
    

    Die Memberfunktion im_Wertebereich sieht folgendermaßen aus:

    bool System::im_Wertebereich(const int &y, const int &x)
    {
    	if(y < MAXY && x < MAXX && y >= 0 && x >= 0)
    		return true;
    	else
    		return false;
    }
    

    MAXY hat den Wert 8 ebenso wie MAXX

    Und zaehleMine:

    int System::zaehleMine(const int &y, const int &x)
    {
    	int Zahl = 0;
    
    	for(int i=(-1);i<2;i++)
    	{
    		for(int j=(-1);j<2;j++)
    		{
    			if(!im_Wertebereich(y+i,x+j))
    			{
    				continue;
    			}
    
    			if(Mine.istMine(y+i,x+j))
    			{
    				Zahl += 1;
    			}
    		}
    	}
    	return Zahl;
    }
    

    Im Voraus schon mal vielen Dank für eure Hilfe
    Sagara



  • Gibt es einen für die Rekursion statischen Fall, in dem zahl, x und y == 0 ist?
    Dann wäre ausbreitung(y+i,x+j) ein Problem...



  • Der Fall tritt nur ein, wenn der Anwender für x und y 0 eingibt, sonst nicht.
    Zum Stack Overflow kommt es aber auch, wenn man z.B. für y == 5 und x == 3 eingibt.

    Decimad schrieb:

    Gibt es einen für die Rekursion statischen Fall, in dem zahl, x und y == 0 ist?
    Dann wäre ausbreitung(y+i,x+j) ein Problem...

    Wieso wäre das denn ein Problem?



  • Na weil ein Aufruf von ausbreitung(0,0) dann ausbreitung(0,0) aufruft. Das sieht für mich auf den ersten Blick ziemlich endlos aus.
    So, jetzt habe ich mir den Algorithmus nochmal genauer angeschaut:
    Ausgehend von der Benutzereingabe, deckt ausbreitung das Feld und alle umliegenden auf. Soweit so gut. Für die umliegenden Felder ruft ausbreitung dafür sich selber auf. Nur wissen die aufgerufenen "ausbreitungs" ja nicht, welche Zellen schon besucht waren (Und brechen auch nirgendwo ab). Ich stelle mir hier gerade unendlich viele Wellen vor, die durch dein Array laufen 😃
    Wenn du ausbreitung nur für solche Felder aufrufen würdest, die noch nicht aufgedeckt sind, dann würde das funktionieren!



  • Ich habe gerade mal ausprobiert was passiert, wenn ich ausbreitung(o,o) ausführe.

    ausbreitung(y+i,x+j);    //y==0,x==0   i==-1,j==-1
                                  //komischerweise bleiben y und x == 0
    

    Wieso wird denn die Rechnung nicht durchgeführt?



  • Die Werte werden ja nur darauf überprüft, ob sie noch im Spielfeld liegen, nicht ob die Rekursion dort schon einmal war.
    Sagen wir mal, ausbreitung(0,0) wurde aufgerufen und ruft jetzt ausbreitung(1,1) auf. Nun ruft ausbreitung(1,1) ja irgendwann wieder ausbreitung(0,0) auf, welches irgendwann wieder ausbreitung(1,1) aufrufen wird und endlos so weiter.



  • Sagara schrieb:

    Ich habe gerade mal ausprobiert was passiert, wenn ich ausbreitung(o,o) ausführe.

    Wieso wird denn die Rechnung nicht durchgeführt?

    Die Rechnung wird ausgeführt, nur wird das Ergebnis ja nicht in x respektive y gespeichert (nirgendwo ein zuweisungsoperator zu finden, oder?).



  • Jetzt verstehe ich was du meintest.

    Vielen Dank für deine Bemühungen 🙂
    Ich hoffe ich kann das Probelem mit diesen Infos lösen

    Viele Grüße
    Sagara



  • Na was hast du denn jetzt?



  • Sorry hatte ausversehen den Beitrag editiert, anstatt einen neuen zu schreiben...
    bin halt noch neu
    Frohe Weihnachten :xmas1:



  • Nee, ich wollte deinen aktuellen Code sehen, der nichts tut...^^


Anmelden zum Antworten