Stackoverflow
-
Hi ich habe ein Problem mit folgendem Quellcode (Ausschnitt aus einer Klasse Wuerfel):
// krwuerfel ist ein 3d boolean array; public boolean feldgesetzt(int x,int y,int z) { return krwuerfel[x][y][z]; } public void setzefeld(int x, int y, int z) { krwuerfel [x][y][z] = true; } public void checkefelder(int x, int y, int z) { bf.setzefeld(x,y,z); if (x == 19) { wasserdurchlaessig = true; } //nachbarfelder überprüfen if( (x-1>=0) && (!bf.feldgesetzt(x-1,y,z)) && (!feldgesetzt(x-1,y,z))) { checkefelder (x-1,y,z); } if( (x+1<=19) && (!bf.feldgesetzt(x+1,y,z)) && (!feldgesetzt(x+1,y,z))) { checkefelder (x+1,y,z); } if( (y-1>=0) && (!bf.feldgesetzt(x,y-1,z)) && (!feldgesetzt(x,y-1,z))) { checkefelder (x,y-1,z); } if( (y+1<=19) && (!bf.feldgesetzt(x,y+1,z)) && (!feldgesetzt(x,y+1,z))) { checkefelder (x,y+1,z); } if( (z-1>=0) && (!bf.feldgesetzt(x,y,z-1)) && (!feldgesetzt(x,y,z-1))) { checkefelder (x,y,z-1); } if( (z+1<=19) && (!bf.feldgesetzt(x,y,z+1)) && (!feldgesetzt(x,y,z+1))) { checkefelder (x,y,z+1); } }
warum erhalt eich hier einen Stackoverflow nach ca. 3000 rekursiven aufrufen von checkefelder().
Wee kann ich das Problem lösen.
Für lösungsansätze wäre ich echt dankbar.bye
Stackoverflow
-
warum erhalt eich hier einen Stackoverflow nach ca. 3000 rekursiven aufrufen von checkefelder()
Ohne Kommentar. Warum machst du das auch so umständlich?
-
Das ist doch auch so ne Aufgabe aus dem BWINF ......
-
Griffin, bist du es?! *SCNR*
Naja, die einfachste Antwort ist wohl: Mach nicht so viel Rekursion. Ich bin zwar der Meinung, dass Java mit mehr als 3000 rekursiven Aufrufen zurechtkommen sollte, aber irgendwann ist Schluss und dann läuft der Stack halt über. Keine Ahnung, ob das bei dir jetzt einzig und allein an der Rekursion liegt, aber es wäre schon möglich. Wenn du eine bessere Hilfe brauchst, dann mußt du mehr Informationen posten. Zum Beispiel die komplette Fehlermeldung, mehr Code usw.!
Algorithmische Hilfe wird dir hier natürlich keiner geben, da es ne BWINF-Aufgabe ist, die du da lösen möchtest.
-
Gregor schrieb:
Griffin, bist du es?! *SCNR*
Vor wenigen Minuten wollte ich schreiben, dass ich damit nichts zu tun habe!
Aber ich dachte mir, wozu nochmal alte Wunden aufreissen
-
Griffin schrieb:
Vor wenigen Minuten wollte ich schreiben, dass ich damit nichts zu tun habe!
Aber ich dachte mir, wozu nochmal alte Wunden aufreissenNimm es mit Humor. Ich werde das auch noch in ein paar Jahren schamlos ausnutzen. :p
-
Gregor schrieb:
Griffin, bist du es?! *SCNR*
ROFL
-
Hi,
es geht mir hier nicht darum nen Algorithmus für das wohlbekannte "BWINF Würfelprob" zu finden, sondern das StackOverflow Problem zu lösen. (Der gleiche Algo in C++ tuts nämlich)
Ich implementiere diese Aufgabe in java nur nochmal als Übung um mich mit der Sprache vertraut zu machen.Was ich dabei interessant finde ist, egal wie groß ich den Stack der VM mit -Xss einstelle es kommt immer ein StackOverflow bei der gleichen Rekursionstiefe.
Könnte mir vielleicht jemand nen Tipp geben woran das liegt.
Die Fehlermeldung lautet:
Exception in thread "main
" java.lang.StackOverflowErrorAbbruch jedes mal beim 3688 Aufruf von checkefelder.
hier nochmal eine leicht abgewandelte version von checkfelder (der Überprüfungswürfel in dem die Besuchten Felder zuvor abgespeichert wurden, wurde ersetzt, in dem jetzt im zu untersuchenden Würfel besuchte Felder direkt als nicht durchlässig markiert werden):
public void checkefelder(int x, int y, int z) { setzefeld(x,y,z);//als Besuchtes feld markieren if (x == 19) { wasserdurchlaessig = true; } //nachbarfelder überprüfen if( (x-1>=0) && (!feldgesetzt(x-1,y,z))) { checkefelder (x-1,y,z); } if( (x+1<=19) && (!feldgesetzt(x+1,y,z))) { checkefelder (x+1,y,z); } if( (y-1>=0) && (!feldgesetzt(x,y-1,z))) { checkefelder (x,y-1,z); } if( (y+1<=19) && (!feldgesetzt(x,y+1,z))) { checkefelder (x,y+1,z); } if( (z-1>=0) && (!feldgesetzt(x,y,z-1))) { checkefelder (x,y,z-1); } if( (z+1<=19) && (!feldgesetzt(x,y,z+1))) { checkefelder (x,y,z+1); } }
Der restliche Code dürfte eigentlich nicht von belang sein.
Jedes Feld des 3d Array krwuerfel ist mit einem Wert belegt.greetz
Stackoverflow
-
Hi, es wäre wirklich nett wenn mir jemand den Stackoverflow erklären könnte.
Mitlerweile läuft mein programm zwar auch unter Java, allerdings nur nachdem ich einen eigenen Stack in Form eines Array's benutze.greetz
Stackoverflow
-
Hi
Was ein stack ist wirst du wohl wissen oder? der speicherbereich mit dem Funktionsparameter übergeben werden und Register und Objektzustände gesichert werden sowie der Programm zustand in den zurückgekehrt werden soll.
Bei jedem Funktions aufruf werden dort daten abgelegt immder das neuste oben drauf. kehrst man aus eine funktion wieder zurück werden die Daten wieder runtergenommen. Rufst du jetzt zu vile Funktionen hintereinander auf ( rekursiv ) ohne daraus wieder zurückzukehren. wird immer mehr zpeicher auf dem stack belegt. und irgend wann ist da dann halt schluss.auserdem rekursive implementierungen lassen sich immer auch anders formulieren. Dafür müste es sogar einen mathematischen beweis geben. ( Numerik is doch wieder so lange her)
gruss