# Stack Overflow Error



## Simon93 (17. Jan 2011)

Hey Leute,
ich arbeite an meinem Sudoku-Löser Programm, dass mitteln DLX das ganze löst.
Jetzt habe ich jedoch einen Stack Overflow Error in BlueJ. In den Zeilen 46 und 59 immer wieder...
Ich denke es kommt daher, dass die sich ständig gegenseitig aufrufen. Das Programm soll morgen auf dem Informationsabend unserer Schule vorgestellt werden, daher wäre ich für jede Hilfe dankbar.
Ich poste jetzt mal den Quelltext, der beiden Funktionen.


```
public static void zeileloeschen(int zeile)
{
    zeilegeloescht[zeile]=true;
    for (int i=0; i<324; i++)
    {
        if (tabelle[zeile][i]==1)
        {
            spalteloeschen(i);
        }
        else
        {}
    }
}
public static void spalteloeschen(int spalte)
{
    spaltegeloescht[spalte]=true;
    for (int i = 0; i<729; i++)
    {
        if (tabelle[i][spalte]==1)
        {
            zeileloeschen(i);
        }
        else
        {}
    }
}
```

So, ich erklär mal die (geplante) Funktionsweise:
Der Funktion zeileloeschen wird eine int Zahl übergeben. Diese Zahl entspricht einer Zeile, die gelöscht werden soll. Dann geht das Programm mithilfe der for-Schleife alle Spalten der Tabelle durch, die ebenfalls gelöscht werden müssen, wenn der Wert 1 ist. Sobald der Erste Wert 1 ist, wird die for-Schleife Unterbrochen, und der Funktion spalteloeschen die betreffende Spalte übergeben, die daraufhin nach allen Zeilen mit einer 1 durchsucht werden soll. Irgendwann muss das ja wieder in den ursprünglichen Schleifen weiter gehen, oder überlade ich das Programm sooo derbe?


----------



## Marco13 (17. Jan 2011)

Wenn ich das richtig überfliege, wird die Methode 324*729 mal aufgerufen. Das könnte(!!!) schlicht und einfach zu viel für den Stack sein. Man könnte ggf. mit
java -Xss10m DasProgramm
(glaub ich) den Stack size vergrößern, oder sich ein anderes Verfahren überlegen.

Gib notfalls mal in beiden Methoden am Anfang aus
System.out.println("loösche zeile "+zeile); // spalte analog
und schau ob er wirklich weiterläuft, oder doch irgendwo hin- und her hüpft


----------



## Simon93 (17. Jan 2011)

Ok, das sieht Problematisch aus, der zeigt immer an, dass er Zeile 6 (auf jeden Fall korrekt) und dann Spalte 96 (kann ich nicht überprüfen, da ich meine 729*324 Tabelle nicht soweit berechnen kann, das macht der PC) löschen will.

EDIT: Ich hau mal zu beginn beider Schleifen ne Überprüfung rein, ob die Zeile schon gelöscht ist.
EDIT2: Kann sich das hier jetzt mal jnd. anschauen und mir sagen, ob es so funktionieren müsste? Bin vom Ergebnis noch nicht begeistert.


```
public static void zeileloeschen(int zeile)
{
    if (zeilegeloescht[zeile]!=true)
    {
    zeilegeloescht[zeile]=true;
    System.out.println("Lösche Zeile: " + zeile);
    for (int i=0; i<324; i++)
    {
        if (tabelle[zeile][i]==1)
        {
            spalteloeschen(i);
        }
        else
        {}
    }
    }
    else
    {}
}
public static void spalteloeschen(int spalte)
{
    if (spaltegeloescht[spalte]!=true)
    {
    spaltegeloescht[spalte]=true;
    System.out.println("Lösche Spalte: " + spalte);
    for (int i = 0; i<729; i++)
    {
        if (tabelle[i][spalte]==1)
        {
            zeileloeschen(i);
        }
        else
        {}
    }
    }
    else
    {}
}
```

Habe das Gefühl, das Programm überspringt einiges...


----------



## Marco13 (17. Jan 2011)

Dass das nicht überprüft wird, hatte ich nicht gesehen (hatte irgendwie das 
if (tabelle_[spalte]==1)
gesehen, und gedacht, das wäre so eine überprüfung)

Es sollte die Löschen, wo eine 1 drinsteht - alles andere wird übersprungen ... oder was meinst du?_


----------



## Simon93 (17. Jan 2011)

Genau, er bekommt ja eine Zeilennummer übermittelt, die er "löschen" soll, und zusätzlich alle Spalten, in denen in der Zeile der Wert 1 ist, in den Spalten wiederrum wird nach weiteren Zeilen gesucht, die eine 1 enthalten, und diese werden wieder mitsamt der Spalten gelöscht. usw...
Das bereitet mir grade Kopfzerbrechen...


----------



## Simon93 (18. Jan 2011)

So habe es geändert, ist aber immer noch zu viel.
Wie setzte ich das "java -Xss10m" um? (benutze Bluej)


----------



## Marco13 (18. Jan 2011)

Mit BlueJ kenne ich micht nicht aus, aber du kannst mal von hier aus BlueJ - Frequently Asked Questions lossuchen.

Wichtiger (und evtl. vorher zu klären) wäre aber, ob er wirklich keine unendliche Rekursion macht....


----------



## DerGroßeNargus (18. Jan 2011)

Sollte wirklich der Stack und seine größe schuld sein, dann gehts mit 

```
java -Xss1024k
```
das setzt zB den Stack auf 1024kb /1 mb

Aber prüfe lieber, ob deine Rekursionsvorschrift sich nicht irgendwo verläuft. Das dürfte wohl Fehlerquelle Nummer 1 für diesen Error sein.

Dazu musst du das Programm in der Kommandozeile erst Kompilieren mit

```
javac -encoding ASCII Dateiname.java
```
dann ausführen mit

```
java -Xss1024k Dateiname
```

Wie man das mit der Kommandozeile startet kannst du ja selber googeln, ich glaube das dürfte kein Problem sein. Oder benutze Eclipse, das ist bisschen mächtiger als BlueJ (obwohl die Klassendarstellung schon recht nett ist in BlueJ...)


----------

