"Zeiger" gesetzt?
lima-city → Forum → Programmiersprachen → Java
ansicht
array
beispiel
code
einzelnen elemente
erledigen
feld
fertige funktionen
feststelle
kleines problem
kopieren
referenz
schleife
schleifen
spiel
umgehen
versuchen
zeiger
zuweisung
zweidimensionalen feldern
-
Ich habe ein kleines Problem.
Ich spiele gerade ein bisschen mit zweidimensionalen Feldern herum, da muss ich feststellen, dass ich seltsamerweise unbewusst einen Java-Zeiger (die es ja eigentlich nicht gibt) gesetzt haben muss.
Wir nehmen an, ich habe ein zweidimensionales Feld "f1[][]" und möchte dieses nun kopieren, um es zu verändern und Versuche damit anzustellen, ohne dass das Original auch verändert wird.
So einfach das auch wirkt, es funktioniert nicht. Wenn ich jetzt fTemp ändere, muss ich feststellen, dass am Schluss f1 mitverändert wurde. Ich habe es auch schon einmal so probiert:private int[][] f1 = new int[10][10] private void blubb() { int[][] fTemp; // [...] fTemp = f1; // [...] }
Aber auch so wird f1 verändert. Es liegt definitiv an dieser Zuweisung. Wenn ich sie auskommentiere und fTemp leer initialisiere, wird nichts verändert.fTemp = f1.clone();
Da muss doch meiner Ansicht nach Java irgendwo intern einen Zeiger gesetzt haben. Wie kann ich das umgehen? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Natürlich ist das so.
Primitive Datentypen werden per pass-by-value übergeben, aber alles was von java.lang.Object erbt, wird per pass-by-reference übergeben(also auch Arrays).
du musst entweder in 2 for-schleifen dein array kopieren(was langsam wäre) oder, du benutzt System.arraycopy(was der schnellere Weg wäre). -
Das liegt daran, dass du Arrayobjekte erstellst, woraus folgt das eine Zuweisung nicht den Array sondern die Referenz darauf kopiert.
Bedeutet: Den Array gibts dann bloß ein mal, aber mit zwei Namen. Um das zu verhindern musst du die einzelnen Elemente von einem Array in den anderen kopieren (per for-Schleife zum Beispiel), da diese Integer, also primitive Datentypen sind, weswegen dann keine Referenzen sondern Werte kopiert werden.
Beispiel:
for (int i=0; i<f1.length;i++) { for (int j=0;j<f1[i].length;j++) { fTemp[i][j]=f1[i][j]; } }
Musst nur noch auf die Feldlängen aufpassen und fertig. Natürlich gibts auch schon fertige Funktionen, die das für dich erledigen...
€dit: HMPF. benutzernaemelchen tippt schneller.
Beitrag zuletzt geändert: 20.1.2011 17:06:07 von alphara -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage