hi zusammen!
ich möchte gerne ein (boolean) 2D-Array einem anderen (boolean) 2D-Array zuweisen.
Hintergedanke dabei ist, dass ich auf dem Array "fields" Abfragen mache, im Genaueren untersuche ich die Nachbarn auf true oder false eines jeden Elementes. Im Zusammenhang mit bestimmten Regeln setze ich dann das untersuchte Element selber auf true oder false. Dazu muss ich aber dieses newFields Array extra anlegen, damit ich mir das alte Array zum Vergleichen merken kann.
Dabei hab ich's fehlerhafter Weise am Anfang einfach mit newFields=fields versucht, wobei aber wohl nur der Pointer newFields auf das Array fields zeigt. Was heißt, wenn ich newFields verändere, verändert sich am Ende auch fields, was ich ja nicht möchte.
Dann hab ich's mit folgender Methode versucht, ich geh also jedes einzelne Element durch und weise es einzeln dem anderen zu. Ist dies so richtig, weil am Ende bekomme ich doch einen Fehler heraus? Die Zuweisung sieht folgendermaßen aus:
Die gesamte Methode sieht so aus, zwischen Zeile 11 und 98 passiert nicht viel, es werden nur die Nachbartypen bestimmt:
in Zeile 99 taucht der Fehler auf, wenn ich das Programm mit bestimmter true false Belegung durchlaufen lasse, zieht er einmal neighbourCounter-- ab, obwohl das fields-Element false sein sollte. Ich schließe darauf, dass die Zuweisung wieder nur durch Pointerarythmetik geschehen ist und kein neues Feld angelegt wurde, weil im neuberechneten (newFields) Array dieses Element tatsächlich auf true steht, obwohl ich doch fields abfragen möchte.
Die Arrays werden natürlich folgendermaßen deklariert:
boolean[][] fields, newFields;
fields = new boolean[x][y];
newFields = new boolean[x][y];
ich möchte gerne ein (boolean) 2D-Array einem anderen (boolean) 2D-Array zuweisen.
Hintergedanke dabei ist, dass ich auf dem Array "fields" Abfragen mache, im Genaueren untersuche ich die Nachbarn auf true oder false eines jeden Elementes. Im Zusammenhang mit bestimmten Regeln setze ich dann das untersuchte Element selber auf true oder false. Dazu muss ich aber dieses newFields Array extra anlegen, damit ich mir das alte Array zum Vergleichen merken kann.
Dabei hab ich's fehlerhafter Weise am Anfang einfach mit newFields=fields versucht, wobei aber wohl nur der Pointer newFields auf das Array fields zeigt. Was heißt, wenn ich newFields verändere, verändert sich am Ende auch fields, was ich ja nicht möchte.
Dann hab ich's mit folgender Methode versucht, ich geh also jedes einzelne Element durch und weise es einzeln dem anderen zu. Ist dies so richtig, weil am Ende bekomme ich doch einen Fehler heraus? Die Zuweisung sieht folgendermaßen aus:
Code:
for (int i = 0; i < fields.length; i++) {
for (int j = 0; j < fields[0].length; j++) {
newFields[i][j] = fields[i][j];
}
}
Die gesamte Methode sieht so aus, zwischen Zeile 11 und 98 passiert nicht viel, es werden nur die Nachbartypen bestimmt:
Code:
//hiermit zähle ich die nachbarn
int neighbourCounter;
//zuweisen des "Merke-Arrays"
for (int i = 0; i < fields.length; i++) {
for (int j = 0; j < fields[0].length; j++) {
newFields[i][j] = fields[i][j];
}
}
//das gemerkte Array durchlaufen und Ecken, Ränder und Innenfeld durchgehen
for (int i = 0; i < fields.length; i++) {
for (int j = 0; j < fields[0].length; j++) {
neighbourCounter = 0;
// (0;0)
if (i == 0 && j == 0) {
for (int k = i; k < i + 2; k++) {
for (int l = j; l < j + 2; l++) {
if (fields[l][k]) {
neighbourCounter++;
}
}
}
// (0;y)
} else if (i == 0 && j == fields[0].length - 1) {
for (int k = i; k < i + 2; k++) {
for (int l = j - 1; l < j + 1; l++) {
if (fields[l][k]) {
neighbourCounter++;
}
}
}
// (x;0)
} else if (i == fields.length - 1 && j == 0) {
for (int k = i - 1; k < i + 1; k++) {
for (int l = j; l < j + 2; l++) {
if (fields[l][k]) {
neighbourCounter++;
}
}
}
// (x;y)
} else if (i == fields.length - 1 && j == fields[0].length - 1) {
for (int k = i - 1; k < i; k++) {
for (int l = j - 1; l < j; l++) {
if (fields[l][k]) {
neighbourCounter++;
}
}
}
// raender
} else if (i == 0) {
for (int k = i; k < i + 2; k++) {
for (int l = j - 1; l < j + 2; l++) {
if (fields[l][k]) {
neighbourCounter++;
}
}
}
} else if (j == 0) {
for (int k = i - 1; k < i + 2; k++) {
for (int l = j; l < j + 2; l++) {
if (fields[l][k]) {
neighbourCounter++;
}
}
}
} else if (i == fields.length - 1) {
for (int k = i - 1; k < i; k++) {
for (int l = j - 1; l < j + 1; l++) {
if (fields[l][k]) {
neighbourCounter++;
}
}
}
} else if (j == fields[0].length - 1) {
for (int k = i - 1; k < i + 1; k++) {
for (int l = j - 1; l < j; l++) {
if (fields[l][k]) {
neighbourCounter++;
}
}
}
} // innenfeld
else {
for (int k = i - 1; k < i + 1; k++) {
for (int l = j - 1; l < j + 1; l++) {
if (fields[k][l]) {
if (fields[l][k]) {
neighbourCounter++;
}
}
}
}
}
if (fields[i][j]) {
//da beim Arraydurchlauf das Element selber auch mitgezählt wird, muss es abgezogen werden, wenn es true ist
neighbourCounter--;
newFields[i][j] = neighbourCounter == ue ? true : false;
} else {
newFields[i][j] = neighbourCounter == g ? true : false;
}
}
}
// das Array wieder zurückzuweisen
for (int i = 0; i < fields.length; i++) {
for (int j = 0; j < fields[0].length; j++) {
fields[i][j] = newFields[i][j];
}
}
in Zeile 99 taucht der Fehler auf, wenn ich das Programm mit bestimmter true false Belegung durchlaufen lasse, zieht er einmal neighbourCounter-- ab, obwohl das fields-Element false sein sollte. Ich schließe darauf, dass die Zuweisung wieder nur durch Pointerarythmetik geschehen ist und kein neues Feld angelegt wurde, weil im neuberechneten (newFields) Array dieses Element tatsächlich auf true steht, obwohl ich doch fields abfragen möchte.
Die Arrays werden natürlich folgendermaßen deklariert:
boolean[][] fields, newFields;
fields = new boolean[x][y];
newFields = new boolean[x][y];