Inhalt eines Arrays ändert sich mysteriös

Diskutiere Inhalt eines Arrays ändert sich mysteriös im Allgemeine Java-Themen Bereich.
kodela

kodela

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.
 
J

JustNobody

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

kodela

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
 
Thema: 

Inhalt eines Arrays ändert sich mysteriös

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben