Gezien de vlotte reacties zal ik maar een stuk code posten. Ik maakte het eigenlijk voor de lol, naar aanleiding van een lezing over zandhoopmodellen. Ik post niet alle code, alleen het relevante stuk. De methode wordt ergens anders aangeroepen in een main.
Een stuk code. Die stomme #@#^$&%^$# gaat helaas alle regels naar links uitlijnen, zelfs als ik een punt aan het begin van elke regel plaats. Helaas, ik krijg die harde tabs niet in deze post.
-----------------------------------------------------------------
private int[][] gr;
private int[][] grid;
public tijdverdrijf(int[][] g)
{
gr = g;
grid = g;
int teller;
int teller2;
...
for(int i = 0; i < 10; i++)
{
for(int j = 0; j < 10; j++)
{
teller2 = 0;
while(gr[j] - teller2 >= 4)
{
System.out.println("gr[" + i + "][" + j + "] = " + gr[j]);
teller = 0;
if(i>0)
{
grid[i-1][j]++;
teller++;
}
if(i<9)
{
grid[i+1][j]++;
teller++;
}
if(j<9)
{
grid[j+1]++;
teller++;
}
if(j>0)
{
grid[j-1]++;
teller++;
}
grid[j] = grid[j] - teller;
teller2 = teller2 + teller;
System.out.println("gr[" + i + "][" + j + "] = " + gr[j]);
System.out.println("grid[" + i + "][" + j + "] = " + grid[j] + "\n");
}
}
}
gr = grid;
setVisible(true);
repaint();
}
-----------------------------------------------------------------
Deze methode krijgt dus een dubbele array van ints binnen. In de dubbele for-loop wordt elk punt uit gr[][] langs gegaan. De waarde van elk punt stelt het aantal zandkorrels voor. Ik wil nu, dat elk gridpunt met waarde groter of gelijk aan 4, één zandkorrel aan elk van zijn vier buren afstaat, net zo lang totdat er minder dan 4 korrels over zijn. Ik gebruik "teller2" in de while om te controleren of het gridpunt al kleiner dan 4 is. "teller" heb ik alleen nodig bij het controleren van randpunten die maar twee of drie buren hebben. Het is de bedoeling dat heel gr[][] uitgelezen wordt en dat de wijzigingen dan in grid[][] worden doorgevoerd. Dus ik wil dat gr[][] ongewijzigd blijft in de loops, en dat grid[][] dus het nieuwe plaatje wordt.
Het gaat echter onverwacht fout. In de 'while' heb ik een paar printopdrachten neergezet om de waarden te controleren. Als ik deze methode aanroep, geef ik hem een grid mee met alle waarden gelijk aan nul, alleen g[4][4] = 24. De output die ik dan krijg uit die System.out.println 's is als volgt:
gr[4][4] = 24
gr[4][4] = 20
grid[4][4] = 20
gr[4][4] = 20
gr[4][4] = 16
grid[4][4] = 16
gr[4][4] = 16
gr[4][4] = 12
grid[4][4] = 12
Terwijl grid[4][4] dus binnen de 'while' steeds met 4 verlaagd wordt, wordt op mysterieuze wijze ook gr[4][4] steeds met 4 verlaagd. "teller2" wordt steeds keurig met 4 verhoogd. Na drie stappen geldt de 'while' niet meer, omdat 12 - 12 niet >= 4 is. Ik had dus verwacht dat de output zou zijn:
gr[4][4] = 24
gr[4][4] = 24
grid[4][4] = 20
gr[4][4] = 24
gr[4][4] = 24
grid[4][4] = 16
...
gr[4][4] = 24
gr[4][4] = 24
grid[4][4] = 0
Iemand enig idee hoe het mogelijk is dat de waarde van gr[4][4] binnen de 'while' ook steeds verlaagd wordt, terwijl ik helemaal niks met gr[][] doe? Merk op dat de regel "gr = grid;" pas helemaal aan het einde van alle loops komt en dus niks met het probleem te maken heeft.