Stack Overflow Error

Simon93

Mitglied
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.

Java:
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

Top Contributor
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

Mitglied
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.

Java:
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...
 
Zuletzt bearbeitet:

Marco13

Top Contributor
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

Mitglied
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...
 
Sollte wirklich der Stack und seine größe schuld sein, dann gehts mit
Code:
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
Code:
javac -encoding ASCII Dateiname.java
dann ausführen mit
Code:
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...)
 

Neue Themen


Oben