Übergabe einer Referenz

kodela

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

mrBrown

Super-Moderator
Mitarbeiter
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.
 

kodela

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

kodela

Bekanntes Mitglied
Warum sollte das nicht funktionieren?
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.
 

mrBrown

Super-Moderator
Mitarbeiter
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.
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
 

kodela

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.
Mag sein, dass ich etwas falsch mache, ich weiß aber nicht, was. Hier auszugsweise mein 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:

mrBrown

Super-Moderator
Mitarbeiter
Ich weiß nicht was du erreichen willst, aber jetzt hast du immer noch das int[][] und zusätzlich ein eindimensionales Zellen-Array?
 

kodela

Bekanntes Mitglied
. . . hast du immer noch das int[][] und zusätzlich ein eindimensionales Zellen-Array?
Was Du mit dem "int[][]" meinst, ist das zweidimensionale Array (9 Zeilen und 9 Spalten) mit den auszuwertenden Daten für ein Str8ts.
Das (zusätzliche) eindimensionale Zellen-Array steht hier nur für den Test auf die Brauchbarkeit der von Dir angeregten "zusätzliche Klasse Feld" und ersetzt die in meinem ersten geposteten Code (private final int[] zellWert = new int[9] ) das eindimensionale Array "zellWert".
Während ich dies hier schreibe schwant mir, dass wir aneinander vorbei argumentiert haben. Ich hatte von Anfang an Zweifel wegen der "zusätzlichen Klasse Feld" und habe auch nachgefragt, was genau damit gemeint ist. Deine Antwort war: "Für eine Zelle". Das bezog ich auf einen Eintrag im int-Array "zellWert", mit dem genau ich ja das Problem habe. In diesem Array werden von den Zellen der gerade auszuwertenden Str8t die Werte gespeichert und auch verändert.
Wären in diesen int-Variablen nicht die Werte sondern Referenzen auf die Werte im zweidimensionalen Array "strFeld" gespeichert, würden sich die Auswirkungen der Änderung einfacher gestalten. Darauf zielte meine Frage.
Mittlerweile gehe ich davon aus, dass sich mein Gedanke nicht so wie zum Beispiel unter C/C++ realisieren lässt und ich habe eine andere Lösung gefunden. Wie im Beitrag #7 schon erwähnt, verwende ich dafür ein eindimensionales Array der Klasse ZELLPOS.
Ich danke Dir für Deine Bereitschaft, mir zu helfen.
 

mrBrown

Super-Moderator
Mitarbeiter
Das wäre ziemlich einfach zu lösen gewesen mit einem Zelle[][] statt dem int.
Das wäre einerseits schöneres Design und andererseits etwa Äquivalent zu Pointer/Referenz in C/C++ ;)
 

Blender3D

Top Contributor
Bla bla, jede Referenz ist doch äquivalent zu einem Pointer. Man hat hier nur einen anderen Begriff gewählt. Also die hellste Kerze auf dem Kuchen.... Ach, lassen wir das.
Zur Info Pointer und Referenz sind beides Zeiger.
Unterschied eine Referenz ist konstant kann nicht mehr geändert werden. Aber einem Pointer kann man ändern.
Siehe Pointer Arithmetik in C oder C++
Also ist ein Pointer nicht gleich einer Referenz.
 

Blender3D

Top Contributor
Ne, Referenzen in Java sind nicht konstant ;)
Object ref = new Object();
ref = die Adresse des Speichers des Objekt.
Lässt sich nur mehr auf null, oder mittels new auf einen neuen Speicherbereich setzen also konstant.
in C:
char* cp = (char*) malloc(sizeof(char) * 4);
strcpy( cp, "ABC" );
cp zeigt auf A
cp++;
cp zeigt auf B
nicht konstant.
;)
 

mrBrown

Super-Moderator
Mitarbeiter
Object ref = new Object();
ref = die Adresse des Speichers des Objekt.
Lässt sich nur mehr auf null, oder mittels new auf einen neuen Speicherbereich setzen also konstant.
in C:
char* cp = (char*) malloc(sizeof(char) * 4);
strcpy( cp, "ABC" );
cp zeigt auf A
cp++;
cp zeigt auf B
nicht konstant.
;)
ref=„Ananas“;
Und schwupps zeigt ref auf ein anderes Bereich.

Aber vergleichen lässt sich Java da schwer mit C/C++, wichtig ist nur, dass für deinen Fall Objekte das richtige wären, ganz unabhängig von Java-Reference, C++-Reference und Pointer ;)
 

kodela

Bekanntes Mitglied
. . . wichtig ist nur, dass für deinen Fall Objekte das richtige wären . . .
Danke @mrBrown, ich sehe das mittlerweile auch so und werde daher prüfen, ob ich an der derzeitigen Struktur etwas verändere. Eine Veränderung hätte weitreichende Auswirkungen, denn die Klasse, um die es mir hier ging, spielt im Grunde nur eine sehr untergeordnete Rolle. Sie wird nach der Neueingabe einer Str8ts-Aufgabe einmal aufgerufen, bekommt die Aufgabe als eindimensionales int-Array mit 81 Werten vorgesetzt, konvertiert sie wegen der besseren Auswertungsmöglichkeiten in ein zweidimensionales Array und soll die Lösung per strategischen Regeln finden. Damit eine Umstellung Sinn macht, müsste ich also auch die weit umfangreichere Aufrufklasse und eine Vielzahl weiterer Klassen an die geänderte Struktur anpassen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Variablen Nach Übergabe einer Variable den Constructor aufrufen Allgemeine Java-Themen 16
S Übergabe / Aufruf einer beliebigen Methode in einer anderen Allgemeine Java-Themen 9
S Übergabe eines Sortierkriteriums für ein Artikel Array mittels BiPredicate<Artikel, Artikel> Allgemeine Java-Themen 13
K ursprüngliche ArrayList ändert sich bei Übergabe in Methode Allgemeine Java-Themen 18
L Übergabe an eine eher einfache Java- Applikation wegen Kündigung Allgemeine Java-Themen 1
W Zugriff auf Objektvariablen vs. Übergabe Allgemeine Java-Themen 3
X Übergabe ... args Allgemeine Java-Themen 5
F Übergabe eines Befehls an Dos-Box Allgemeine Java-Themen 5
S OOP this-Referenz als Konstruktor-Übergabe Allgemeine Java-Themen 8
J Übergabe von post request Parametern Allgemeine Java-Themen 9
nutellastulle Zugriff, Übergabe, Bearbeitung und Ausgabe von Jlist Allgemeine Java-Themen 6
M Übergabe mehrer Files an selbstprogrammieren Parser Allgemeine Java-Themen 4
A Problem bei Übergabe von Werten in ein double Array. Allgemeine Java-Themen 21
W Threads & Pipes --> Ist eine Übergabe von Objekten mö Allgemeine Java-Themen 7
P Übergabe- Parameter SQL Map Allgemeine Java-Themen 45
M Übergabe von Referenzen Allgemeine Java-Themen 3
G Probleme bei String Übergabe um Public Key zu erzeugen ? Allgemeine Java-Themen 6
R Übergabe und Autostart von Paint Allgemeine Java-Themen 4
V Übergabe per Referenz. Allgemeine Java-Themen 5
L Array Übergabe Allgemeine Java-Themen 8
G Übergabe funzt nicht, aber wieso? Allgemeine Java-Themen 3
J Methoden per Übergabe eines "Methodennamen-Strings&quot Allgemeine Java-Themen 20
lhein Übergabe von Objekten von Java an C über JNI Allgemeine Java-Themen 5
C Übergabe Parameter verändert Allgemeine Java-Themen 5
O Text aus einer Textdatei rausholen, der zwischen zwei Schlüsselworten steht Allgemeine Java-Themen 4
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
T JNA, Aufruf der Funktionen einer dll Allgemeine Java-Themen 5
I Vom Monolith zu Services in einer Webseite Allgemeine Java-Themen 1
W Variable Initialisierung mit dem Ergebnis einer Regex Allgemeine Java-Themen 1
O Werte einer Generic LinkedList zusammenrechenen Allgemeine Java-Themen 14
C Sortieren und Selektieren einer ArrayList<Point3D> Allgemeine Java-Themen 6
A Einzelne Objekte und Unterobjekte einer ArrayList ausgeben Allgemeine Java-Themen 53
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Wie kann ich den Wert aus einer If abfrage ausgeben Allgemeine Java-Themen 23
S HTML einer Webseite 1:1 so bekommen wie es auch der Browser anzeigt? Allgemeine Java-Themen 14
melaniemueller Einzelne Zeile aus einer txt Datei in einem String speichern Allgemeine Java-Themen 12
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
J (Geplante) Änderungen an einer Datei vorübergehend speichern und anwenden? Allgemeine Java-Themen 12
ME2002 Fragen aus einer Java Klausur Allgemeine Java-Themen 67
_user_q Obfuscate einer .jar-Datei mit ProGuard? Allgemeine Java-Themen 2
_user_q Verknüpfung einer .jar-Datei (liegt z. B. auf dem Desktop) im Autostart-Ordner erstellen? Allgemeine Java-Themen 20
C Parsen einer sich updatenden Html mithilfe von jsoup Allgemeine Java-Themen 4
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
H Performance einer Monte-Carlo-Simulation verbessern Allgemeine Java-Themen 6
LimDul Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus Allgemeine Java-Themen 18
Zeppi NullPointerException in einer if-Abfrage Allgemeine Java-Themen 6
D Abbruch einer ViewScoped Bean in Arbeit Allgemeine Java-Themen 2
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
Lukas2904 Wie kann man cps (ClicksPerSecond) in einer GUI anzeigen lassen? Allgemeine Java-Themen 4
O Produziert das Tool "jpackage" (ab JDK 14) .exe Dateien, die auf einer Zielumgebung ohne JRE lauffähig sind ?` Allgemeine Java-Themen 7
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
N BlueJ Implementation einer Analoguhr Allgemeine Java-Themen 0
O Formatierte String ausgabe bei vier Variablen in einer Zeile Allgemeine Java-Themen 1
N Speicherort einer Datei im Explorer ändern Allgemeine Java-Themen 8
O Datentypen Wie kann ich den Typ einer ArrayList abfragen ? Allgemeine Java-Themen 7
O Leerzeichen und Umlaute im Pfad einer Java Applikation machen Probleme Allgemeine Java-Themen 13
H Mehrere PNG-Files in einer Datei Allgemeine Java-Themen 9
G Java Editor Löschen doppelter Zahlen einer Liste Allgemeine Java-Themen 2
J JSON Daten von einer Webseite erhalten Allgemeine Java-Themen 2
L RegEx für Teile einer Berechnung Allgemeine Java-Themen 14
L Erste Schritte TDD testen einer Methode mit injezierten Services? Allgemeine Java-Themen 12
J Zerlegen einer Zahl Allgemeine Java-Themen 6
Zrebna Wie kann man endgültig aus einer Rekursion ausbrechen? Allgemeine Java-Themen 14
MiMa Person in einer Arraylist hinzugügen mit Prüfung ? Allgemeine Java-Themen 6
Meeresgott Effizientester Weg um nach der Value einer verschachtelten Map aufzulösen Allgemeine Java-Themen 5
H Mehrere Datentypen in einer Arraylist speichern Allgemeine Java-Themen 9
MiMa Prüfziffer einer EAN Nummer berechnen Allgemeine Java-Themen 4
MiMa Erstellungsdatum einer Datei Allgemeine Java-Themen 10
Drachenbauer Wie kann ich einer existierenden Enum von außerhalb veränderte Werte zuweisen? Allgemeine Java-Themen 5
S HTML den ich von einer URL hole nicht identisch mit dem HTML im Browser Allgemeine Java-Themen 1
S Rückgabe einer HttpURLConnection für eine Seite einlesen bei der man eingeloggt ist..? Allgemeine Java-Themen 5
O Java-Applikation tut in Netbeans, als JAR nicht, wegen Pfadangaben einer benötigten Datei Allgemeine Java-Themen 8
M Hilfe bei einer Java Programmieraufgabe! Ab morgen Montag um 08:00 Uhr Allgemeine Java-Themen 5
J Algorithmen Analyse einer Schleife Allgemeine Java-Themen 6
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
J Die Letzte Zahl aus einer Text datei lesen Allgemeine Java-Themen 8
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
A Mithilfe von einer Nummer einen Namen finden n-Beziehung Allgemeine Java-Themen 8
Scream_ilias Auf einer Website die anmeldedaten eingeben Allgemeine Java-Themen 9
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
I Lohnt sich heutzutage der Aufwand einer Portierung für MacOS Allgemeine Java-Themen 8
J Suchen von einer Scannereingabe in einem HashSet Allgemeine Java-Themen 1
M Konstruktor einer Methode Allgemeine Java-Themen 35
L Echtzeitdaten aus einer Webseite ziehen mit Java Allgemeine Java-Themen 19
V EMail, Attachments auslesen von einer Email Allgemeine Java-Themen 0
T Google Links in einer Liste Allgemeine Java-Themen 4
T Sinn einer toString Methode Allgemeine Java-Themen 3
P Durchlaufen einer Queue Allgemeine Java-Themen 9
J Größe einer CD ermitteln Allgemeine Java-Themen 10
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
H Länge einer verketteten Liste Allgemeine Java-Themen 4
B Quellcode einer Java libary finden um zu copy & paste'n Allgemeine Java-Themen 5
N Daten einer JCoTable in JTextArea anzeigen Allgemeine Java-Themen 7
sascha-sphw Java 9 module Zugriff auf eine resource einer anderen JAR Allgemeine Java-Themen 0
N Generic Type einer Generischen Klasse während der Laufzeit bekommen Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben