Du bist nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: DeveloperTalk. Falls dies dein erster Besuch auf dieser Seite ist, lies bitte die Hilfe durch. Dort wird dir die Bedienung dieser Seite näher erläutert. Darüber hinaus solltest du dich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutze das Registrierungsformular, um dich zu registrieren oder informiere dich ausführlich über den Registrierungsvorgang. Falls du dich bereits zu einem früheren Zeitpunkt registriert hast, kannst du dich hier anmelden.

psycho

Fortgeschrittener

  • »psycho« ist der Autor dieses Themas

Beiträge: 413

Registrierungsdatum: 26.06.2011

Danksagungen: 80

  • Private Nachricht senden

1

17.12.2012, 19:24

Java Array Kopieren

Hey Leute...

Ich hab ein Problem bei dem echten kopieren von Arrays. Nachdem ich nach 1h bemerkt habe, dass Arrays bei sowas a = array, b = a genau das selbe ist, habe ich arraycopy getestet.

Aber es funktioniert trotzdem nicht so wie erwünscht:

Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
int [][] kekse= new int[9][9];
		
		int[][] copySudoku = new int[9][9];
	
				
				
			
		System.arraycopy(kekse, 0, copySudoku, 0, kekse.length);
		
		copySudoku[0][0] = 9;
		kekse[0][0] = 5;



Weiß jemand wo der Fehler liegt?

Denn eigentlich sollte ja ArrayCopy eine tiefe Kopie sein bzw. eine echte und nicht nur einfach eine Referenz.
Computer sind dazu da, uns die Arbeit zu
erleichtern, die wir ohne sie gar nicht hätten.

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »psycho« (18.12.2012, 19:15)


JuKu

Profi

Beiträge: 574

Registrierungsdatum: 29.09.2011

Danksagungen: 48

  • Private Nachricht senden

2

17.12.2012, 20:23

Hmmm...
Also bei PHP geht das so:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$a 1;
$b 2;

function test ($a, &$b) {

$a 3;
$b 3;

}

test($a, &$b);
echo $a ", " $b;

//Ausgabe: 1, 3


Habs nicht getestet, aber vllt. hilft dir der Tipp weiter... :S
Wenn euch mein Beitrag weitergeholfen hat, drückt auf "Bedanken"!
Danke! :D

Johannes S.

Fortgeschrittener

Beiträge: 444

Registrierungsdatum: 24.06.2011

Wohnort: Lychen

Danksagungen: 71

  • Private Nachricht senden

3

17.12.2012, 22:59

Wenn du eine Array erstellst setzt Jave immer alle Werte in diesem Array auf den Wert der 0 entspricht.
Also bei byte, short, int, long auf 0, bei boolean auf false und bei Klassen als Typen auf null.
Das heißt die eine Schleife wo du alle Elemente durchgest wird nicht benötigt ;)

Den Sinn der 2. Schleife verstehe ich auch nicht. Die setzt doch einfach alle Werte in dem Feld copySodoku auf 9 O.o was soll da die zusätzliche Schleife? XD

arrayCopy habe ich noch nie verwendet und ich weiß jetzt nicht wo genau dein Problem ist aber wenn du mit dieser Funktion das Array kopieren willst könnte ich mir gut Vorszellen das das nicht geht. Deine Arrays sind ja praktisch immer Array in Arrays.. du wirst mit der Funktion warscheinlich nur das äußere Array kopieren was aber zur Folge hat, dass das äßere Array immernoch auf die selben "suparrays" zeigt wesshalt änderungen an einzelnen Elementen immernoch beide Variablen betreffen. Lediglich das autauschen von ganzen "Suparrays" dürfte sich nicht auf das andere Array auwirken.

Ich hoffe ich konnte helfen. Ich habe dein Vorhaben nicht wirklich rauslesen können daher weiß ich nicht ob das das war, was du wissen wolltest.
Signatur ?

Erik

Profi

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

4

18.12.2012, 15:15

Ja die schleifen sind i-wie komisch :D
die erste bringt nix und bei der zweiten die innere, kp was die soll :D

aber egal, wenn du schon dabei bist, warum nimmste zum kopieren nicht auch ne schleife?
2 dimensionen, also 2 verschachtelte for-schleifen und fertig?
und dann copySoduku[row][col] = kekse[row][col];
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

psycho

Fortgeschrittener

  • »psycho« ist der Autor dieses Themas

Beiträge: 413

Registrierungsdatum: 26.06.2011

Danksagungen: 80

  • Private Nachricht senden

5

18.12.2012, 19:14

Die Schleifen sind eigentlich für was anderes in meinem Programm, hab sie jetzt aber drin gelassen bzw. geändert um irgendwelche Werte zu haben.



Naja also mir geht es im Prinzip darum:

Ein Array ist mit Werten gefüllt. (a)
Dieses Array will ich kopieren. (b)

Wenn ich nun aber Änderungen an a mache darf dies keine Auswirkungen auf b haben und genauso dürfen Änderungen auf b keine Änderung in a hervorrufen.

2 dimensionen, also 2 verschachtelte for-schleifen und fertig?
und dann copySoduku[row][col] = kekse[row][col];
Werde ich morgen mal probieren, hab leider heute keine Zeit mehr dafür ;)

PS: Ich werde mal die Schleifen rausnehmen oben^^
Computer sind dazu da, uns die Arbeit zu
erleichtern, die wir ohne sie gar nicht hätten.

Johannes S.

Fortgeschrittener

Beiträge: 444

Registrierungsdatum: 24.06.2011

Wohnort: Lychen

Danksagungen: 71

  • Private Nachricht senden

6

19.12.2012, 20:42

Also wie ich schon gesagt habe, die Funktion zum Kopieren von Arrays, wenn es eine gibt, habe sie nie genutzt, wird warscheinlich nur das äußere Array kopieren. Du hast ja ein 2-Dimensionales Array bzw. Ein Array von Arrays. Das heißt das äußere Array wird von der Funktion wohl wirklich kopiert wie du es haben willst und wenn du ein Element, also ein Unter-Array, austauchst, hat das auf das kopierte Array wirklich keinen Einfluss aber wenn du ein einzelnen Wert in einem Unter-Array änderst, änderst du ja den Wert in einem Array das nicht kopiert wurde sondern das lediglich in beiden äußeren Arrays member ist. Das heißt du kopierst das äußere Array und hast dann 2 unabhängige Arrays die aber die selben Arrays als Elemente enthalten. Das ist meine Vermutung dazu.

Wenn du das ganze Array kopieren willst schreib doch einfach folgendes:

Java-Quelltext

1
2
3
4
5
6
xyz[][] b = new xyz[a.length][a[0].length];
for (int n = 0; n < a.length; ++n) {
    for (int m = 0; m < a[0].length; ++m) {
        b[n][m] = a[n][m];
    }
}
Signatur ?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Johannes S.« (25.12.2012, 20:29)


Erik

Profi

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

7

19.12.2012, 21:50

ja soweit waren wir schon :D
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

Johannes S.

Fortgeschrittener

Beiträge: 444

Registrierungsdatum: 24.06.2011

Wohnort: Lychen

Danksagungen: 71

  • Private Nachricht senden

8

19.12.2012, 23:37

Mir ist die Frage nur nicht mehr ganz klar weil ich denke wir haben alles gesagt. Daher habe ich das nochmal zusammengafasst :D
Signatur ?

psycho

Fortgeschrittener

  • »psycho« ist der Autor dieses Themas

Beiträge: 413

Registrierungsdatum: 26.06.2011

Danksagungen: 80

  • Private Nachricht senden

9

20.12.2012, 11:25

Gut Danke Leute^^

Funktioniert jetzt soweit ;)

Aber schon irgendwie komisch, dass es keine Funktion von Java selbst gibt, dass man ein Array kopieren kann...
Computer sind dazu da, uns die Arbeit zu
erleichtern, die wir ohne sie gar nicht hätten.

Erik

Profi

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

10

20.12.2012, 14:00

naja, du kannst ja mal versuchen, ein beliebig tiefes array das in der letzten dimension mit beliebigen datentypen gefüllt ist, zu kopieren und eine funktion dafür zu schreiben ;D

EDIT: andererseits müsste das mit mehr hardwarenähe ja theoretisch gehen... O.o
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

cedi

Profi

Beiträge: 702

Danksagungen: 78

  • Private Nachricht senden

11

25.12.2012, 14:00

Denn eigentlich sollte ja ArrayCopy eine tiefe Kopie sein bzw. eine echte und nicht nur einfach eine Referenz.

Soweit ich weiß, gibt es in Java doch keine Pointer und Referenzen?!

psycho

Fortgeschrittener

  • »psycho« ist der Autor dieses Themas

Beiträge: 413

Registrierungsdatum: 26.06.2011

Danksagungen: 80

  • Private Nachricht senden

12

25.12.2012, 14:34

Soweit ich weiß, gibt es in Java doch keine Pointer und Referenzen?!
Ja das nicht. Aber ich hab auf irgendeiner Javaseite gelesen, dass Clone eingentlich eine tiefe Kopie sein soll, war es aber nicht.

Aber das Problem wurde schon gelöst ;)
Computer sind dazu da, uns die Arbeit zu
erleichtern, die wir ohne sie gar nicht hätten.

cedi

Profi

Beiträge: 702

Danksagungen: 78

  • Private Nachricht senden

13

25.12.2012, 14:50

jo, dachte ich mir, dass das iwo so stand... Aber das mit der Referenz hat mich etwas gewundert ;)

Vielleicht funktioniert die ArrayCopy funktion nur mit 1-Dimmensionalen Arrays...

psycho

Fortgeschrittener

  • »psycho« ist der Autor dieses Themas

Beiträge: 413

Registrierungsdatum: 26.06.2011

Danksagungen: 80

  • Private Nachricht senden

14

25.12.2012, 16:56

Das funktioniert auch nur mit einer Dimension wie schon oben geklärt ;)
Computer sind dazu da, uns die Arbeit zu
erleichtern, die wir ohne sie gar nicht hätten.

Johannes S.

Fortgeschrittener

Beiträge: 444

Registrierungsdatum: 24.06.2011

Wohnort: Lychen

Danksagungen: 71

  • Private Nachricht senden

15

25.12.2012, 20:32

Wenn ".clone" eine richtige Kopie anfertigt, müsste man den Quelltext für 2-Dimensionale Arrays den ich oben gepostet habe

Java-Quelltext

1
2
3
4
5
6
xyz[][] b = new xyz[a.length][a[0].length];
for (int n = 0; n < a.length; ++n) {
    for (int m = 0; m < a[0].length; ++m) {
        b[n][m] = a[n][m];
    }
}


folgender maßen abkürzen können:

Java-Quelltext

1
2
3
4
xyz[][] b = new xyz[a.length][a[0].length];
for (int n = 0; n < a.length; ++n) {
    b[n] = a[n].clone();
}
Signatur ?

Erik

Profi

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

16

26.12.2012, 22:04

Ja das müsste gehen.

Und doch es gibt in Java Referenzen und im Prinzip auch Call by Reference, es bedeutet terminologisch nur etwas anderes als in c/c++.
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

Johannes S.

Fortgeschrittener

Beiträge: 444

Registrierungsdatum: 24.06.2011

Wohnort: Lychen

Danksagungen: 71

  • Private Nachricht senden

17

27.12.2012, 13:53

In Java wrden Objekte automatisch IMMER als Referenz übergeben und wenn man eine Kopie erstellen will, muss man das eben extra angeben. Z.B. über ".clone()".
Signatur ?

Erik

Profi

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

18

27.12.2012, 17:00

jo... man muss halt nur bedenken, dass referenzen selbst by value übergeben, was paradox ist, wenn man c/c++ gewohnt ist :D
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

psycho

Fortgeschrittener

  • »psycho« ist der Autor dieses Themas

Beiträge: 413

Registrierungsdatum: 26.06.2011

Danksagungen: 80

  • Private Nachricht senden

19

27.12.2012, 18:23

Wie gesagt, es klappt alles schon lange wie gewünscht ;)

Und mein Sudokugenerator ist auch schon fertig ;)
Computer sind dazu da, uns die Arbeit zu
erleichtern, die wir ohne sie gar nicht hätten.

Erik

Profi

Beiträge: 1 274

Registrierungsdatum: 22.06.2011

Wohnort: Deutschland ;)

Danksagungen: 307

  • Private Nachricht senden

20

27.12.2012, 19:27

wär auch komisch, wenn das noch net funktionieren würde mit dem kopieren :D
Beste Webite im Internet ( ͡° ͜ʖ ͡°)
xinra.de

Ähnliche Themen