Inhalt eines Arrays ändert sich mysteriös

kodela

Bekanntes Mitglied
Hallo,

ich habe es hier schon einmal geschrieben, ich versuche ein von mir in den 90er Jahren in C++ geschriebenes Schachprogramm nach Java zu transferieren. Dabei bin ich heute auf ein Problem gestoßen, das mir sehr rätselhaft erscheint.

Dazu hier zwei Codeschnipsel:
Java:
    cApp.tfHinweis.setText("");           
    DISPLAY fld = board.getFeld(i);
    int fig = fld.piece;
    int col = fld.color;
    if (talk.getcolorToPlay() == col) {
        if (select < 0 && fig > 0) {                    // erstmalig Klick auf Figur
            select = i;
            markFigur(i);
            lastIndex = i;
            lastFeld = fld;
        } else if (lastFeld.piece > 0){                 // eine Figur wird gezogen
            DISPLAY oldfld = new DISPLAY(0, 0, false);
            board.setFeld(lastIndex, oldfld);           // Ausgangsfeld leeren
            PrintPiece(lastIndex, 0, 0);                   
            board.setFeld(i, lastFeld);                 // Figur auf Zielfeld setzen
            PrintPiece(i, lastFeld.piece, lastFeld.color);
            lastFeld.piece = 0;                         // setzt auch piece im Display-Array auf '0'
            select = -1;
        }
    } else {
        cApp.tfHinweis.setText(" Eingabefehler");
    }
    
    ******************************
    
    public DISPLAY getFeld(int i) {
        return Display[i];
    }
    
    public void setFeld(int i, DISPLAY f) {
        Display[i] = f;
    }
Der Code im oberen Teil wird nach einem Mausklick auf ein Schachfeld ausgeführt. In Zeile 2 wird aus dem Display-Array für die einzelnen Felder die Belegung des angeklickten Feldes geholt. Steht auf diesem Feld eine Figur, wird sie markiert, die Position in lastIndex und die Figur in lastFeld gespeichert.
Wird nun ein weiteres Feld angeklickt, soll die mit dem ersten Klick markierte Figur von ihrem ursprünglichen Platz auf das jetzt angeklickte Feld verschoben werden. Dafür wird in der Zeile 13 die Figur aus dem Display-Array entfernt, in Zeile 14 die Anzeige der Figur gelöscht, in Zeile 15 die Figur im Display-Array eingetragen und in Zeile 16 dann angezeigt.

Das funktioniert alles einwandfrei. Wenn ich aber, wie in Zeile 17 gezeigt, die in lastFeld eingetragene Figur entferne, wird die Figur auch im Display-Array entfernt.

Dazu muss ich sagen, dass der Code für den beschriebenen Vorgang aus der Klasse InOut stammt und das Display-Array in der Klasse CBoard geführt wird. Das Auslesen und Eintragen der Werte aus diesem Array erfolgt über die beiden im unteren Teil gezeigten Methoden.

Wenn ich den Code in Zeile 17 auskommentiere, dann werden die Werte im Display-Array nicht verändert. Warum kommt diese Änderung zustande?

Bevor mich jemand darauf hinweist, dass die Schreibweise meines Codes nicht in allen Fällen den Java Code-Konventionen entspricht, ich weiß. Wenn alle Code übersetzt ist, werde ich das ändern.

Eben sehe ich, dass die von mir angegebenen Zeilennummern nicht angezeigt werden, schade, aber die Kommentare helfen sicherlich auch, sich in dem kurzen Stück zurechtzufinden.
 
K

kneitzel

Gast
Also ich bin mir nicht sicher, ob ich dich richtig verstanden habe, aber Java arbeitet mit Referenzen. Du hast also nur eine Instanz. Es wird daher in board.setFeld nur eine Referenz gespeichert auf die Instanz gespeichert. Das ist ein bisschen vergleichbar mit einem Zeiger in c++.
Wenn du nun die Instanz änderst, dann wirkt sich das überall aus, wo du eben die Referenz auf diese Instanz gespeichert hast.

Das ist also nicht wie in c++, wo ein Copy Konstruktor aufgerufen wird um eine Kopie zu erzeugen (Bei einem Call by Value und nicht bei einem Call By Reference sprich ohne &).
 

kodela

Bekanntes Mitglied
Hallo @JustNobody,

danke für den "Hirnstupser". Mir war zwar klar, dass ich beim Aufruf von setFeld() eine Referenz auf lastFeld übergebe und habe es daher in setFeld() mit einer Einzelzuweisung der beiden Werte piece und color versucht. Aber das half auch nicht. Das Problem war die Zuweisung einer eine Referenz auf Display für fld in Zeile 1 (DISPLAY fld = board.getFeld(i);). Diese Referenz habe ich mit
lastFeld = fld; an lastFeld weitergegeben. Als dann aber im DISPLAY-Array das Ausgangsfeld auf "leer" gesetzt wurde, wurde damit auch lastFeld "leer".

Jetzt sieht der Code so aus und funktioniert.
Java:
    DISPLAY fld = board.getFeld(i);
    int fig = fld.piece;
    int col = fld.color;
    if (talk.getcolorToPlay() == col) {
        if (select < 0 && fig > 0) {                         
            select = i;
            markFigur(i);
            lastIndex = i;
            lastFeld.piece = fld.piece;     <--
            lastFeld.color = fld.color;     <--
        } else if (lastFeld.piece > 0){                       
            board.setFeld(lastIndex, 0, 0); <--                   
            PrintPiece(lastIndex, 0, 0);                   
            board.setFeld(i, lastFeld.piece, lastFeld.color);   <--
            PrintPiece(i, lastFeld.piece, lastFeld.color);
            select = -1;
        }
    } else {
        cApp.tfHinweis.setText(" Eingabefehler");
    }

    ********************************************************

    public void setFeld(int i, int p, int c) {
        Display[i].piece = p;
        Display[i].color = c;
        Display[i].attacked = false;
    }

Gruß, kodela
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Inhalt eines Arrays loggen Allgemeine Java-Themen 8
D Inhalt eines Ordners auflisten. Allgemeine Java-Themen 2
7 Inhalt eines Objekts leeren aber Objekt nicht löschen Allgemeine Java-Themen 17
D Inhalt eines Packages im Code verarbeiten Allgemeine Java-Themen 18
R Eingabe eines Textfeldes mit Inhalt einer Datei vergleichen Allgemeine Java-Themen 4
P Wie kann ich den Inhalt eines Textdokuments löschen? Allgemeine Java-Themen 9
G JTextField Inhalt in einem Long einfügen Allgemeine Java-Themen 2
KeVoZ_ JSoup - Website Inhalt/Element mit String vergleichen Allgemeine Java-Themen 2
A Collections Inhalt einer Liste mit Inhalt anderer Liste vergleichen ? Allgemeine Java-Themen 7
T String auf Inhalt bzw. Schema überprüfen Allgemeine Java-Themen 12
T Threads Input/Output im Thread - Datei ohne Inhalt Allgemeine Java-Themen 1
I Inhalt einer Website auslesen Allgemeine Java-Themen 6
L Input/Output Datei einlesen und Inhalt in Array schreiben Allgemeine Java-Themen 3
U JNI -> Inhalt dll zugreifen Allgemeine Java-Themen 5
O Collections ListIterator gibt Inhalt von ArrayList nicht aus Allgemeine Java-Themen 3
S leeres package obwohl inhalt da Allgemeine Java-Themen 53
Iron Monkey Inhalt von JTable in die Textdatei mit StringWidth schreiben Allgemeine Java-Themen 3
A Excel nach bestimmten Inhalt durchsuchen Allgemeine Java-Themen 8
U Webseiten Inhalt auslesen... Allgemeine Java-Themen 7
D File mit Inhalt kopieren und dieses File dann neu erstellen ? Allgemeine Java-Themen 4
I Webseite auslesen (welche mittels Javascript Inhalt einbindet) Allgemeine Java-Themen 4
D Eclipse Kein Zugriff auf Inhalt einer referenzierten .jar Allgemeine Java-Themen 5
N Objekte aus Array Inhalt erzeugen Allgemeine Java-Themen 8
C JFormattedTextField Inhalt einer Variable zuweisen Allgemeine Java-Themen 11
J XML Inhalt von Web abfragen Allgemeine Java-Themen 6
W Inhalt aus String evaluieren Allgemeine Java-Themen 6
E Regex HTML Tag und Inhalt löschen Allgemeine Java-Themen 4
S Inhalt einer zip-Datei anzeigen Allgemeine Java-Themen 11
A Inhalt ListEditor und Buttons ausblenden Allgemeine Java-Themen 5
Y Excel datei einlesen und inhalt verarbeiten Allgemeine Java-Themen 8
D Inhalt der JTextArea drucken Allgemeine Java-Themen 2
J Inhalt von HashMap vergleichen Allgemeine Java-Themen 3
T Bestimmten Inhalt aus Manifest.MF auslesen Allgemeine Java-Themen 8
F JFrame zeigt Hintergrund und nicht den Inhalt Allgemeine Java-Themen 12
T (Binary)Datei einlesen, Inhalt ändern, Datei schreiben Allgemeine Java-Themen 4
O Inhalt vom JTextfield im DebugMode ermitteln? Allgemeine Java-Themen 2
O Vektor kopieren (Inhalt, nicht Referenzen) Allgemeine Java-Themen 3
J Datei Inhalt vergleichen (schnell & effizient!) Allgemeine Java-Themen 10
MQue Array inhalt verschieben Allgemeine Java-Themen 6
N RandomAccessFile überschreibt Inhalt Allgemeine Java-Themen 3
Y Klassen mit ähnlichem Inhalt: wie unterscheiden? Allgemeine Java-Themen 9
M Inhalt von Textdatei in Spinner Allgemeine Java-Themen 5
T Bild verliert Inhalt. Allgemeine Java-Themen 6
A "Webseite-Inhalt" ins Arabische&Französische ü Allgemeine Java-Themen 2
T HashMap#get neues Objekt, selber Inhalt Allgemeine Java-Themen 12
B Inhalt von StringBuffer löschen Allgemeine Java-Themen 14
J File: Inhalt des Ordners aus dem die aktuelle Datei ausgefüh Allgemeine Java-Themen 6
K Inhalt von Vektoren auslesen Allgemeine Java-Themen 6
T iso datei (Image) mit Java einlesen und Inhalt entpacken Allgemeine Java-Themen 3
K JTree Inhalt löschen und Anzeige aktualisieren Allgemeine Java-Themen 13
P Inhalt einer Mail anzeigen Allgemeine Java-Themen 5
G ResultSet auf Inhalt prüfen? Allgemeine Java-Themen 2
G Inhalt von Servern anzeigen lassen Allgemeine Java-Themen 9
G Inhalt einer Textdatei in eine AWT List schreiben Allgemeine Java-Themen 3
R Tabellen inhalt mal vorhanden, mal nicht!?! Allgemeine Java-Themen 2
O regulärer Ausdruck zum durchsuchen eines Strings verwenden Allgemeine Java-Themen 2
T Rotationswinkel eines Bildes bestimmen Allgemeine Java-Themen 4
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
J JavaScript innerhalb eines Java Projekts ausführen Allgemeine Java-Themen 2
Encera Größe eines Objektes in Byte berechnen Allgemeine Java-Themen 2
8u3631984 Prüfen ob min. ein Element eines Sets in einem anderen Set enh Allgemeine Java-Themen 4
M Array Rang eines Elements Allgemeine Java-Themen 4
OnDemand Teile eines Links entfernen Allgemeine Java-Themen 6
H Auslesen eines (LDAP-)Attributs in Active Directory Allgemeine Java-Themen 2
W JSON parsen eines ,mit JS.stringify erstellten Strings Allgemeine Java-Themen 27
H Textposition eines gedrehten Textes verschieben Allgemeine Java-Themen 8
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
E Ersetzen eines Bildes in der Kopfzeile eines Word-Docx-Dokuments mit Apache POI XWPF Allgemeine Java-Themen 0
N Fahrtrichtung eines selbstfahrenden Auto ändern Allgemeine Java-Themen 3
T Letztes Zeichen eines Strings enfernen Allgemeine Java-Themen 14
S Übergabe eines Sortierkriteriums für ein Artikel Array mittels BiPredicate<Artikel, Artikel> Allgemeine Java-Themen 13
gotzi242 Schatzsuche mithilfe eines O(log n) Algorithmus Allgemeine Java-Themen 2
C Koordinaten LONG/LAT eines neuen Punktes in bestimmter Entfernen und Winkel berechnen Allgemeine Java-Themen 3
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
LimDul Direktes return eines Array geht nicht Allgemeine Java-Themen 20
S Mittelwert anhand eines Stream berechnen Allgemeine Java-Themen 5
kodela Breite eines erweiterten Monitors feststellen Allgemeine Java-Themen 5
R Zeilen eines 2d Arrays abwechselnd links und rechts mit Nullen auffüllen Allgemeine Java-Themen 14
Zrebna Alternative Darstellung eines Codesnippets Allgemeine Java-Themen 33
bueseb84 Wget mit Wildcards - oder wie lädt man bei JFrog die letzte Version eines Artifacts herunter Allgemeine Java-Themen 3
N Erkennen eines Programs Allgemeine Java-Themen 2
N Pausieren eines Programmes Allgemeine Java-Themen 4
D Input/Output Implementierung eines CommandHandlers/Parsers für viele Eingaben Allgemeine Java-Themen 26
M Gibt es eine API die den aktuellen Wert eines Indikators beim Trading zurückgibt? Allgemeine Java-Themen 7
F Wie bekommt man alle Filenamen eines Webserver Verzeichnisses Allgemeine Java-Themen 6
A Fehler beim Öffnen eines Projekts Allgemeine Java-Themen 6
N Eigenschaften eines Buttons per Setter verändern Allgemeine Java-Themen 5
S Ausfuehrung eines Programms aufzeichnen..? Allgemeine Java-Themen 4
X Ermittlung eines doppelte Paars mit Streams Allgemeine Java-Themen 50
Stonie Prüfen von direkter Implementierung eines Interfaces Allgemeine Java-Themen 7
S Vorbereitung eines Praktikums Allgemeine Java-Themen 4
H Aufruf eines Web Service anhand übergebenen Parameter Allgemeine Java-Themen 2
M Weiterleiten von empfangenen Nachrichten eines StompSessionHandlers Allgemeine Java-Themen 1
J Programm zum Suchen eines Wortes im Dateisystem Allgemeine Java-Themen 4
H Rename eines Projekts Allgemeine Java-Themen 1
J Fenstergröße eines anderen Programmes auslesen Allgemeine Java-Themen 9
ReinerCoder auf Klassen innerhalb eines package zugreifen Allgemeine Java-Themen 22
Meeresgott Erste Schritte Sourcetree - Git | Suchen eines Commits Allgemeine Java-Themen 2
E Status eines USB Mikrofon abfragen Allgemeine Java-Themen 2
DaCrazyJavaExpert OOP Ansätze und Tipps zum Porgrammieren eines Taschenrechners Allgemeine Java-Themen 25

Ähnliche Java Themen

Neue Themen


Oben