Problem mit strukturiertem Array

kodela

Bekanntes Mitglied
Hallo,

ich brauche ein Array mit x strukturierten Eintragungen. Dafür habe ich eine Klasse mit der gewünschten Struktur definiert und anschließend ein Array mit 20 Elemente dieser Klasse erzeugt. Das sieht so aus:

Code:
    private class TestType
    {
        int objekt;
        int color;
        int index;
    };
    private TestType[] cTest = new TestType[20];

Was ich bekomme, ist ein Array mit 20 Integerwerten. Wo ist mein Denkfehler?

Danke für jeden Hinweis,

kodela
 
Zuletzt bearbeitet:
Ich habe die Klasse jetzt um einen Konstruktor erweitert, in dem alle drei Integerwerte auf 0 gesetzt werden. Das ändert aber auch nichts.
 
Wie kommst du darauf, dass irgendwas falsch ist? Wie genau überprüfst du das?

Wie gesagt, du musst dein "Regal" auch befüllen. Das machst du z.B. so:

Java:
private class TestType {
  int objekt;
  int color;
  int index;

  public TestType(int objekt, int color, int index) {
    this.objekt = objekt;
    this.color = color;
    this.index = index;
  }
};

// in deiner aufrufenden Klasse
private TestType[] cTest = new TestType[20]; // leeres "Regal" mit 20 Fächern

// in einer Methode, z.B. Konstruktor der aufrufenen Klasse
for (int i = 0; i < 20; i++) {
  cTest[i] = new TestType(i, i, i); // erzeugt ein neues Objekt und legt es in das "Regalfach"
}
 
Zuletzt bearbeitet:
Ich sehe das beim Debuggen mit NetBeans an der Methode, die das Array initialisieren soll. Die sieht im Prinzip so aus:

Code:
    private void SetTests()
    {
        for (int i = 0; i < 20 i++)
        {
            cTest[i].objekt = 1;
            cTest[i].color = 5;
            cTest[i].index = 20;
        }
    }
cTest hat die vorgegebene Länge 20, aber alle Einträge sind nicht 0 wie ich erst geschrieben habe, sondern null. Deshalb habe ich die Klasse ja um den Konstruktor erweitert. Damit sieht sie insgesamt jetzt etwa so aus: (etwa, weil ich die Bezeichner geändert habe)
Code:
    public class TestType
    {
        int objekt;
        int color;
        int index;
        public TestType(int laenge) {
            for (int i = 0; i < laenge; i++) {
            this.objekt = 0;
            this.color = 0;
            this.index = 0;              
            }
        }
    };
Wenn ich im Konstruktor der Klasse einen Breakpoint setze, sehe ich, dass dieser nie angesprungen wird.
 
Die Schleife gehört nicht in deinen Type selbst sondern in die Aufrufende Klasse / Methode. Schau dir mein Beispiel nochmal an, und die bildliche Vorstellung von einem Regal kann ich nur empfehlen. In Richtung der bildlichen Vorstellung vielleicht nochmal ein benanntes Beispiel:

Java:
class Marmeladenglas {
  private int fuellmenge;
  private String sorte;

  public Marmeladenglas(int fuellmenge, String sorte) {
    this.fuellmenge = fuellmenge;
    this.sorte = sorte;
  }
}

class MarmeladenRegalImKeller {
  private Marmeladenglas[] glaeserImRegal;

  public MarmeladenRegalImKeller {
    glaeserImRegal = new MarmeladenGlas[20]; // hier passiert nichts anderes, als zu sagen das Regal hat Platz für 20 Gläser

    glaeserImRegal[0] = new MarmeladenGlas(200, "Erdbeere"); // jetzt stellst du ein Erdbeermarmeladenglas in das erste Fach
  }
}
 
@Thallius: Entschuldige bitte, aber ich bin der Meinung, ich hätte die Frage zur Überprüfung in meiner vorstehenden Antwort (Thread 7) ausreichend beantwortet. Es sieht aber so aus, dass ich die Deine Frage missverstanden habe. Vielleicht kannst Du mir helfen, Deine Frage richtig zu verstehen.

@MoxxiManagarm: Das sieht bei mir doch auch so ähnlich aus, nur initialisiere ich das Array nicht über den Konstruktor, sondern ein einer eigenen Methode. Mein Array hat 120 Elemente mit je 3 Objekten, von denen unmittelbar bei Programmstart 48 gesetzt werden müssen.
 
@MoxxiManagarm: Das sieht bei mir doch auch so ähnlich aus, nur initialisiere ich das Array nicht über den Konstruktor, sondern ein einer eigenen Methode. Mein Array hat 120 Elemente mit je 3 Objekten, von denen unmittelbar bei Programmstart 48 gesetzt werden müssen.
Bisher hast du nicht gezeigt, wie du das Array befüllst. Irgendwo solltest du ein cTest[i] = new TestType(...); stehen haben.
 
@kodela: Bitte zeige konkreten Code, den Du jetzt hast. Wenn ich Deinen Code aus #7 sehe, dann bin ich mir sicher, dass Du es nicht so hast, wie @MoxxiManagarm es gezeigt hat.

Code:
    public class TestType
    {
        int objekt;
        int color;
        int index;
        public TestType(int laenge) {
            for (int i = 0; i < laenge; i++) {
            this.objekt = 0;
            this.color = 0;
            this.index = 0;            
            }
        }
    };

Einmal diesen Code erläutert:
Du erstellt die Klasse TestType und diese bekommt drei Felder vom typ int: objekt, color und index.

Dann hast Du einen Konstruktor, der ein int nimmt. Und dann werden die int Felder der neuen Instanz laenge mal auf 0 gesetzt. Das bringt natürlich viel...

Was Du wohl haben wirst ist sowas:
private TestType[] cTest = new TestType[20]; // leeres "Regal" mit 20 Fächern
Aber wie @MoxxiManagarm bereits mit dem Regal Vergleich erläutert hat: Damit hast Du lediglich ein Array, welches 20 Referenzen auf TestType aufnehmen kann. Da wird aber noch kein einziges Element vom Typ TestType erzeugt und da wird somit auch nie ein Konstruktor aufgerufen.

Und das ist dann das, was Du im Debugger siehst: Alles null Werte.

Was Du also nun tatsächlich machen musst, ist sowas:
Code:
    private void SetTests()
    {
        for (int i = 0; i < 20 i++)
        {
            cTest[i].objekt = 1;
            cTest[i].color = 5;
            cTest[i].index = 20;
        }
    }
Nur eben ist cTest[i] ja noch null. Es fehlt auch die Erzeugung einer neuen Instanz:
Code:
    private void SetTests()
    {
        for (int i = 0; i < 20 i++)
        {
            if (cTest[i] == null) cTest[i] = new TestType(); // Hier wird bei Bedarf eine neue Instanz von TestType erzeugt.
            cTest[i].objekt = 1;
            cTest[i].color = 5;
            cTest[i].index = 20;
        }
    }

Damit das aber klappt, muss Dein Konstruktor weg, damit java wieder einen default Konstruktor erzeugt.
 
Hier ist konkreter unveränderter Code:
Code:
public class ChessBoard {

    ...
    ...
    
    public class BOARDTYPE
    {
        int piece;
        int color;
        int index;
    };   
    public BOARDTYPE[] cBoard;
    
    public ChessBoard() {   // Konstruktor
        ...
        cBoard = new BOARDTYPE[0x78];
        ...
        SetPieces();
        ...
    }
    ...
    ...

    private void SetPieces()
    {
        for (int i = 0; i < 8; i++)
        {
            cBoard[i + 0x70].piece = PIECES[i];  <- hier Breakpoint gesetzt
            cBoard[i + 0x70].color = black;
            cBoard[i + 0x60].piece = pawn;
            cBoard[i + 0x60].color = black;

            cBoard[i + 0x10].piece = pawn;
            cBoard[i + 0x10].color = white;
            cBoard[i].piece = PIECES[i];
            cBoard[i].color = white;
        }
    }
    ...
    ...
}
Im Anhang ein Screenshot wenn ich mir bei gesetztem Breakpoint den Inhalt von cBoard anzeigen lasse.

Ganz allgemein zur Information: Ich bin dabei, mein Schachprogramm bowili, welches ich vor etwa 20 Jahren (1994-2004) geschrieben habe, nach Java zu transformieren.
 

Anhänge

  • Boarddype.png
    Boarddype.png
    33 KB · Aufrufe: 6
@JustNobody:
Das mit der Initialisierung der Werte in der Klasse war nur ein Test, ob es eventuell damit geht. Aber was Du am Schluss schreibst, dass man einfach eine Instanz hinzufügen müsse, leuchtet mir ein. Ich muss das probieren, allerdings in den nächsten beiden Stunden geht es nicht.
 
In deinem Code fehlt noch cBoard[i] = new BOARDTYPE();. Was für eine alte Sprache ist das? Ich würde davon abraten eine solche Transformierung zu machen, vorallem nicht ohne Java Vorkenntnisse. Java ist eine objektorientierte Sprache, ich bin mir relativ sicher, dass, welche Sprache du immer vorher verwendet hast, das nicht ist.
 
Ohne seinen Vorschlag sieht es genauso aus 😉

du solltest natürlich nicht nur stumpf kopieren, du musst das schon etwas anpassen, in dem Fall brauchst du das mehrfach für jeden Index des Arrays.
 
Also stell Dir einmal vor, dass cBoard ein großer Apotheker-Schrank ist mit ganz vielen Schubladen.

Aber die Schubladen sind alle rausgezogen ... die kannst Du Dir aber geben lassen.

Nun gehst Du hin und sagst: Ich will jetzt die erste Schublade nutzen. Also: Neue Schublade her und in Fach 1 geschoben.
Dann gehst Du an das Fach 1 + 0x70 -> UPS, da ist ja gar keine Schublade drin!

Ja, das ist schon etwas doof, nicht wahr?
 
Danke allen,

Die for-Schleife hat gefehlt:
Code:
        cBoard = new BOARDTYPE[0x78];
        
        for (int i = 0; i < cBoard.length; i++) {
            cBoard[i] = new BOARDTYPE();
        }

@mrBrown: Ich soll nicht nur stumpf kopieren. Glaube nicht, dass ich mir dessen nicht bewusst bin.
 

Zurück
Oben