Übergabe einer Referenz

Diskutiere Übergabe einer Referenz im Allgemeine Java-Themen Forum; Hallo, für ein Programm zum Erstellen und Lösen von Str8ts habe ich ein zweidimensionales Array "str8tsFld" definiert. Ein solches Str8ts-Feld...

  1. kodela
    kodela Mitglied
    Hallo,

    für ein Programm zum Erstellen und Lösen von Str8ts habe ich ein zweidimensionales Array "str8tsFld" definiert.

    Ein solches Str8ts-Feld ist damit in je 9 Zeilen und Spalten unterteilt. Zu diesen 18 Bereichen kommen noch eine variable Anzahl von unterschiedlich großen Teilbereichen der Zeilen bzw. Spalten, die soganannten Str8ts. Jede Str8t kann über die Klasse STR8 beschrieben werden.

    Alle Str8ts werden in der Liste "strList" zusammengefasst. Über diese Liste werden die verschiedenen Auswertemethoden aufgerufen. In den Methoden werden nun aus der Angabe zur ersten und letzten Zelle einer Str8t auch die dazwischen liegenden Zellen festgestellt und für jede Zelle ein Listeneintrag angelegt, über den die Informationen zu jeder Zelle abgefragt werden können.

    Nun mein Problem: In der Liste der einzelnen Zellen wird durch die Zuweisung der Zellwert und nicht eine Referenz auf die Zelle selbst übernommen. Das bedeutet also, über einen solchen Listeneintrag kann ich zwar dessen Wert verändern. Damit verändere ich aber nicht den Wert im Str8ts-Rasterfeld. Soll der Wert direkt an der "Quelle" verändert werden, muss dies über eine direkte "Ansprache" erfolgen.

    Meine Frage: Wie kann ich in der Liste der einzelnen Zellen an Stelle der Zellinhalte eine Referenz auf die jeweilige Zelle selbst aufnehmen?

    Hier einige Codeschnipsel zum Verständnis meines Problems:
    Code (Java):
        // Instanzieren des Str8ts-Rasters, der Str8ts-Liste und der Werteliste
        private final int[][] str8tsFld = new int[9][9];
        private final STR8[] strList = new STR8[50]
        private final int[] zellWert = new int[9];
     
     
        // Beispiel einer Wertzuweisung innerhalb einer Methode:
        wrt[0] = str8tsFld[str8t.ersteZelle.zl][str8t.ersteZelle.sp];
     
        // Beispiel für eine Zuweisung
        str8tsFld[str8t.letzteZelle.zl][str8t.letzteZelle.sp] = mKnd;
        str8tsFld[str8t.letzteZelle.zl][str8t.letzteZelle.sp] |= lwFlag;
        str8tsFld[str8t.letzteZelle.zl][str8t.letzteZelle.sp] |= n2;

        /**
         * Klasse für die Definition der Position einer Zelle im Str8t-Raster
         */

        private class ZELLPOS {
            int zeile;
            int spalte;
        }

        /**
         * Klasse für die Definition einer Str8t durch die Positionsangabe
         * der jeweils ersten und letzten Zelle der Str8t, deren Länge und
         * der Angabe, ob alle Zellen der Str8t gelöst sind
         */

        private class STR8 {
            ZELLPOS ersteZelle = null;
            ZELLPOS letzteZelle = null;
            int len = 0;
            boolean geloest = false;
         
            // Konstruktor
            public STR8() {
                this.ersteZelle = new ZELLPOS();
                this.letzteZelle = new ZELLPOS();
            }
        }
    MfG, kodela
     
  2. Vielleicht hilft dir dieser Java-Kurs hier weiter --> (hier klicken)
  3. mrBrown
    mrBrown Bekanntes Mitglied
    Ich würde es über eine zusätzliche Klasse Feld lösen, die du statt int nutzt - intern speichert Feld dann den Zustand mit einem int.
     
  4. kodela
    kodela Mitglied
    Wie ist das gemeint, eine Klasse nur mit einem int für das Str8ts-Feld oder für eine Zelle in diesem Feld?
     
  5. mrBrown
    mrBrown Bekanntes Mitglied
    Für eine Zelle
     
  6. kodela
    kodela Mitglied
    Nein das funktioniert über eine zusätzliche Klasse bei mir nicht, hätte allerdings den Vorteil, dass man zusätzlich noch irgend welche Eigenschaften, z.B. enthält Vorgabewert, ist gelöst, mit verwalten könnte. Aber eine Referenz auf die Zelle im Str8ts-Feld (Array) bekomme ich über die zusätzliche Klasse ZELLE (so habe ich sie benannt) nicht.
     
  7. mrBrown
    mrBrown Bekanntes Mitglied
    Warum sollte das nicht funktionieren?
     
  8. kodela
    kodela Mitglied
    Wenn ich das wüsste! Ich kann nur sagen, auch wenn ich an Stelle eines "normalen" Integerwertes eine eigene Klasse mit einem Integerwert für den Inhalt einer Zelle (bitcodiert mit Vorgabewert, Lösungswert, möglichen Lösungswerten vom Programm verwaltet, mögliche Lösungswerte von User gesetzt, Sperrzelle mit und ohne Sperrwert und farbliche Markierung durch den User) verwende, wird über diese die vermeintlich referenzierte Zelle im Str8ts-Feld (zweidimensionales int-Array) nicht verändert.

    Derzeit verwende ich ein eindimensionales Array der Klasse ZELLPOS. Damit kann ich auf die Quelldaten zugreifen und sie auch ändern.
     
  9. mrBrown
    mrBrown Bekanntes Mitglied
    Dann hast du da irgendwas falsch gemacht - wenn Array und dein anderer Code das gleiche Objekt referenzierten, ist es das gleiche Objekt und ändert sich in beiden gleich.
    Zeig mal Code dazu
     
  10. kodela
    kodela Mitglied
    Mag sein, dass ich etwas falsch mache, ich weiß aber nicht, was. Hier auszugsweise mein Code:
    Code (Java):
    public class STR8TSAUSWERTUNG implements GlobaleVariablen {

        . . .
     
        private final int[][] strFeld = new int[9][9];
        private final STR8[] strList = new STR8[60];
        private final ZELLE[] zelle = new ZELLE[9];
     
        . . .
     
        public STR8TSAUSWERTUNG(Str8tsApp mFrame) {

            . . .
         
            for (int i = 0; i < 9; i++) {
                    zelle[i] = new ZELLE();
                }
            }
        }
     
     
        // Mit "initAuswertung(aktStr)" werden alle Str8ts gesucht und
        // als STR8-Objekte in die Liste "strList" aufgenommen.
     
        // Mit "auswertenStr8t" werden die Str8ts in Abhängigkeit
        // ihrer Länge den speziellen Auswertemethoden übergeben.
        // zum Beispiel mit:
     
        geaendert += check2Str(strList[i]);
     
        . . .
     
        /**
         * Wertet Straßen der Länge Zwei aus.
         * @param str8t Infos füe eine 2er-Str8t
         * @return      Anzahl der vorgenommenen Änderungen
         */

        private int check2Str(STR8 str8t) {
     
            . . .
         
            wrt[0] = strFeld[str8t.ezPos.zl][str8t.ezPos.sp];
         
            // zum Testen auch mit:
            zelle[0].wert = strFeld[str8t.ezPos.zl][str8t.ezPos.sp];
         
            . . .
         
            // Auswertung für "strFeld" bedingt Änderung Str8ts-Feld
            // zuerst über die zu testende Klasseninstanz zelle:    

    ->      zelle[0].wert &= mK2[wrt[1]];

            // Der Wert in "strFeld" hat sich nicht verändert
         
            // Jetzt mit direkter Adressierung:
         
            strFeld[str8t.ezPos.zl][str8t.ezPos.sp] &= mK2[wrt[1]];
         
            // Die Änderung wird in "strFeld" übernommen.
         
            . . .
         
        }
     
        . . .
     
         /**
         * Klasse für die Definition einer Str8t durch die Positionsangabe
         * der jeweils ersten und letzten Zelle der Str8t und deren Länge
         */

        private class STR8 {
            ZPOS ezPos = null;
            ZPOS lzPos = null;
            int len = 0;
            boolean geloest = false;
            // Konstruktor
            public STR8() {
                this.ezPos = new ZPOS();
                this.lzPos = new ZPOS();
            }
        }
     
        /**
         * Für Testzwecke eingefügte Klasse
         */

        private class ZELLE {
            int wert;
        }
    }
     
    Zuletzt bearbeitet: 13. Aug. 2017
  11. mrBrown
    mrBrown Bekanntes Mitglied
    Ich weiß nicht was du erreichen willst, aber jetzt hast du immer noch das int[][] und zusätzlich ein eindimensionales Zellen-Array?
     
Die Seite wird geladen...

Übergabe einer Referenz - Ähnliche Themen

Darf man den Übergabeparameter in einer Methode nicht verwenden?
Darf man den Übergabeparameter in einer Methode nicht verwenden? im Forum Java Basics - Anfänger-Themen
Wie kann man mit einer ID-Spalte über eine Parameterübergabe auf eine Seite verweisen?
Wie kann man mit einer ID-Spalte über eine Parameterübergabe auf eine Seite verweisen? im Forum Datenbankprogrammierung
Ausführen einer Batch mit Parameterübergabe funktioniert nicht richtig
Ausführen einer Batch mit Parameterübergabe funktioniert nicht richtig im Forum Allgemeine Java-Themen
Probleme bei der Übergabe einer Variable
Probleme bei der Übergabe einer Variable im Forum Java Basics - Anfänger-Themen
Memento Pattern | übergabe einer Kopie des Arrays
Memento Pattern | übergabe einer Kopie des Arrays im Forum Java Basics - Anfänger-Themen
Thema: Übergabe einer Referenz