StackOverflow - woher kommt es?

Status
Nicht offen für weitere Antworten.

frau-u

Aktives Mitglied
Hi,

Ich habe hier ein kleines Programm programmiert, was ein sogenanntes "Magisches Quadrat" ausgibt.
Komischerweise bekomme ich jedes Mal, wenn ich es mit einer geraden Zahl (2, 4, 6, 8...) ausprobiere die Fehlermeldung:
Exception in thread "main" java.lang.StackOverflowError

Hier der Code:

Code:
class MagischesQuadrat {	
	
	int[][] feld;	
	int i;
	int x, y;
	int size = 0;
	
	MagischesQuadrat(int n) {		
		
		size = n;
		feld = new int[n][n];
		i = 1;
		x = n/2;
		y = n/2+1;
		feld[x][y] = i;		
		
		for (i = 2; i<=n*n; i++) {
			if (x-1<0)
				x = n-1;
			else x = x - 1;			
			if (y + 1 > n-1)
				y = 0;
			else y = y + 1;
			setzen(x,y,n);
		}
	}		
		
	void setzen(int x, int y, int n) {
		if (feld[x][y] == 0) {
			feld[x][y] = i;
		} else {
			if (x + 1 > n-1)
				x = 0;
			else x = x + 1;			
			if (y + 1 > n-1)
				y = 0;
			else y = y + 1;
			setzen(x,y,n);
		}
	}
		
	public void print() {	
		for (x = 0; x < size; x++) {
			System.out.println("");
			for (y = 0; y < size; y++)
				System.out.print(feld[x][y] + " | ");
		}
	}	
		
	
	
	public static void main(String[] args) {		
		MagischesQuadrat mq = new MagischesQuadrat(4);
		mq.print();
	}
}

Jemand eine Ahnung woran das liegt?
Thx.
 
Bei 2 kommt bei mir:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
at MagischesQuadrat.<init>(MagischesQuadrat.java:16) ==> feld[x][y] = i;
at MagischesQuadrat.main(MagischesQuadrat.java:54)

Und die Api meint zu StackOverFlowError:
Thrown when a stack overflow occurs because an application recurses too deeply.

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/StackOverflowError.html

Also, rufst Du Dein MagischesQuadrat wahrscheinlich endlos auf. Vielleicht hilft Dir das ja ein bißchen.
 
Anonymous hat gesagt.:
Bei 2 kommt bei mir:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
at MagischesQuadrat.<init>(MagischesQuadrat.java:16) ==> feld[x][y] = i;
at MagischesQuadrat.main(MagischesQuadrat.java:54)

Das ist ja noch zu verkraften. Ab 3 macht es ohnehin mehr Sinn.

Und die Api meint zu StackOverFlowError:
Thrown when a stack overflow occurs because an application recurses too deeply.

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/StackOverflowError.html

Also, rufst Du Dein MagischesQuadrat wahrscheinlich endlos auf. Vielleicht hilft Dir das ja ein bißchen.

Das ist mir ja im Prinzip klar, doch ich verstehe nicht, wo genau es hakt.
Wenn ich es im Kopf durchgehe, finde ich kein Problem.
 
Schau genau, und du hast es:

Code:
...
	            y = 0;
	         else {
	         	y = y + 1; 
	         	setzen(x,y,n);
	         }
...
Du hast die Klammern bei der "Else" vergessen. Ansonsten gibt es halt 'ne Endlosschleife (oder besser gesagt endlose Verschachtelung/Rekursion).
 
abollm hat gesagt.:
Schau genau, und du hast es:

Code:
...
	            y = 0;
	         else {
	         	y = y + 1; 
	         	setzen(x,y,n);
	         }
...
Du hast die Klammern bei der "Else" vergessen. Ansonsten gibt es halt 'ne Endlosschleife (oder besser gesagt endlose Verschachtelung/Rekursion).

Sorry, aber das ist Quark, allerdings ist die Einrückung auch etwas mißverständlich, muss ich zugeben.

Das if und else dient dazu, die x- und y-Werte zu bestimmten, bevor dann das "setzen(x,y,n);" aufgerufen wird.
 
Ich habe deinen Code rein inhaltlich betrachtet nicht abgeklopft, klar ist aber, dass du eine Endlos-Rekursion hast, wenn der Methodenaufruf außerhalb der ELSE-Klammern steht. Lasse mich aber auch gerne eines Besseren belehren!
 
abollm hat gesagt.:
Ich habe deinen Code rein inhaltlich betrachtet nicht abgeklopft, klar ist aber, dass du eine Endlos-Rekursion hast, wenn der Methodenaufruf außerhalb der ELSE-Klammern steht. Lasse mich aber auch gerne eines Besseren belehren!

Hmm, ok, dann müsste vielleicht eine zusätzliche Schleife her. Mal austesten.
Thx.
 
Ich nehme alles zurück und behaupte (fast) das Gegenteil:

Zitat aus Wikipedia:
Zur Konstruktion magischer Quadrate gibt es verschiedene Verfahren. Das einfachste Verfahren funktioniert für alle magischen Quadrate mit ungerader Zahl von Feldern (also 3×3, 5×5, 7×7 etc.). Man fängt oben in der Mitte mit 1 an, und füllt dann die anderen Zahlen der Reihe nach gemäß der folgenden Regel in die anderen Felder ein:

Das scheint mir der Hinweis zu sein, denn für ungerade Zeile/Spalten funktioniert dein Code.

Ich musste erst wieder inhaltlich verstehen, was genau das m.Q. bedeutet.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben