# Methode verändert mein Eingabe Array oO



## snape6666 (26. Jan 2011)

Hi,
ich bin gerade dabei aus Spaß ein Sudoku zu programieren und hänge jetzt gerade daran dass mit die Start Methode mein Default Array (also ein folles Feld mit allen Zahlen) abändert.....

eigentlich soll sie mir ein neues Array erzeugen in dem einfach elemente gelöscht werden aus dem Default Array aber irgendwie wird mein Default mit geändert..

hier der Constructor der Klasse und die MEthode Start  hoffe ihr habt eine idee..

Danke im Voraus!!


```
public Sudoku(int Level)
	{
		//Fuellt Default mit einem neu generierten Feld (Dient spaeter zusaetzlich als Ueberpruefung)
		Default   = Neustart();
		//Macht das Spielfeld Spiel-Fertig (entnimmt Zahlen)
		Spielfeld = Start1(Default,Level);
	}
```


```
//Entnimmt dem neu generierten Zahlenfeld Werte zum erhoehen der Schwierigkeit
	protected int[][] Start1(int[][] Neu, int Level)
	{
		//Zaehlt in abhaengigkeit des Levels 5 = -35 Elemente, 9 = -63 Elemnte 
		for(int i =0;i<7*Level;i++)
		{	
		//Zufalls-Zahlen fuer den Vergleich	
		int a =(int)Math.round(Math.random()*8);
		int b =(int)Math.round(Math.random()*8);
		
		while(Neu[a][b]==0)
		{
			a =(int)Math.round(Math.random()*8);
			b =(int)Math.round(Math.random()*8);
		}
		Neu[a][b]=0;
		}
		
		return Neu;
	}
```


----------



## XHelp (26. Jan 2011)

Du solltest ganz dringend deine Namenswahl überdenken. 
	
	
	
	





```
eineVariable
```
, 
	
	
	
	





```
EineKlasse
```
 und default ist eh ein schlüsselwort und sollte auf in großschreibung nicht verwendet werden.
Es handelt sich um das selbe Objekt, was du da veränderst. Könntest ggf mit .clone() eine Kopie erstellen.


----------



## snape6666 (26. Jan 2011)

so die variablen habe ich jetzt mal schnell geändert =)
ja wie kann ich das machen dass "spielfeld"  und ("default" jetzt "uhrsprung") "uhrsprung" 2 object atribute werden die sich nicht gegenseitig verändern oO dachte ein Objekt kann mehre Atribute haben oder hatte ich da was falsch verstanden =(

oh.... habe gerade mal versucht in der gui ein abbild des uhrsprünglichen Defaults zu machen und dann erst Start() auszuführen aber iwi wird selbst dann das ziwschen gespeicherte verändert obwohl es kein objekt der Klasse Sudoku ist =( bin grad mit meinem latein am ende... glaub ich geh schlafen 

Wäre nett wenn mir einer erklärt welchen denkfehle rich noch habe..^^

gn8


----------



## xehpuk (26. Jan 2011)

Es wäre ganz hilfreich, wenn du auch sagen würdest, wie du es versucht hast. Denn mit einem Abbild funktioniert es auch.
In deinem bisherigen Code nimmst du direkt Änderungen an 
	
	
	
	





```
neu
```
 vor, wie du selbst bemerkt hast. Das liegt daran, dass Parameter als Referenz übergeben werden (wenn es sich um Objekte handelt). Daher musst du das Array erst kopieren, bevor du es veränderst.
Ein einfaches 
	
	
	
	





```
clone()
```
 wird hier nicht reichen, da es nur eine flache Kopie erzeugt. Deswegen musst du jedes einzelne Array auch kopieren. Dies würde dann so aussehen:


```
int[][] result = neu.clone();
for (int i = 0; i < neu.length; i++)
	result[i] = neu[i].clone();
```
Im Anschluss nimmst du die Änderungen an 
	
	
	
	





```
result
```
 vor und gibst dieses dann zurück.


----------



## snape6666 (26. Jan 2011)

ja ok ich versuche das mal in der gui. also ein neues Objekt erzeugen mit vollem Feld, dann abspeichern in zwischenspeicher array;


```
for(int i =0;i<9;i++){
  for(int j=0;j<9;j++){
      speicher[i][j]=feld[i][j];
  }
}
```

und führe dann Start aus. ginge das so oder muss ich das mit dem clone schreiben oO weil speicher is ja elemt von gui und net von sudoku?


----------



## Empire Phoenix (26. Jan 2011)

Ich emfehle dir erstmal einige Grundlagen zb call by reference und call by copy nachzulesen. Die brachst du mindestens um Objectorientiert programieren zu können.


----------



## snape6666 (26. Jan 2011)

so habs hinbekommen^^
ich habe einfach eine Kopie erzeugt in der Gui und jetzt gehts =)

Vielen Dank für den Tipp


----------

