Zugriff auf mehrdimensionales Array aus Klasse

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Zugriff auf mehrdimensionales Array aus Klasse

    Hi Leute, ich habe mal ne Frage.
    Und zwar versuche ich jetzt auf die Klassen-Elemente zuzugreifen.
    Das funktioniert aber leider nicht, ich bekomme immer die Fehlermeldung:

    "Exception in thread "main" java.lang.NullPointerException
    at gameServer.tPoker.main(tPoker.java:14)
    "

    Quellcode

    1. public class tPoker
    2. {
    3. /**
    4. * @param args
    5. */
    6. public static void main(String[] args)
    7. {
    8. int i, i2;
    9. tCard card[][] = new tCard[4][13];
    10. for(i=0; i<4; i++)
    11. {
    12. for(i2=0; i2<13; i2++)
    13. {
    14. card[i][i2].col = i; // hier ist der Fehler
    15. card[i][i2].val = i2+1;
    16. }
    17. }
    18. }
    19. }
    Alles anzeigen


    Habt ihr ne Lösung für mich? Sitze schon ne Stunde hier rum und bin am Probieren...
    In C++ läuft es ohne Probleme, es muss aber unbedingt in JAVA sein.

    Danke schon mal im voraus
    hornetracer83
  • ok, Leute, ich habe das Problem woanders lösen können, wen's interessiert:

    Quellcode

    1. public class tCard
    2. {
    3. //private attribute
    4. private int col;
    5. private int val;
    6. //konstruktor
    7. public tCard(){}
    8. public tCard(int col, int val){
    9. this.col = col;
    10. this.val = val;
    11. }
    12. //get-set-methoden
    13. public int getcol(){return this.col;}
    14. public int getval(){return this.val;}
    15. }
    Alles anzeigen


    Quellcode

    1. public class tPoker
    2. {
    3. /**
    4. * @param args
    5. */
    6. public static void main(String[] args)
    7. {
    8. // Karten initialisieren
    9. int i, i2;
    10. tCard card[][] = new tCard[4][13];
    11. for(i=0; i<4; i++)
    12. {
    13. for(i2=0; i2<13; i2++) //so richtig
    14. {
    15. card[i][i2] = new tCard(i, i2+1);
    16. }
    17. }
    18. }
    19. }
    Alles anzeigen
  • Re: [FRAGE] Zugriff auf mehrdimensionales Array aus Klasse

    "hornetracer83" schrieb:

    Fehlermeldung:

    "Exception in thread "main" java.lang.NullPointerException
    at gameServer.tPoker.main(tPoker.java:14)
    "

    komisch dass der "Null Pointer Exception" sagt - ich hätte jetz darauf
    getippt: die For-Schleife z.B. sei i2 = 12, dann ist die Bedingung ja
    erfüllt nich ? dann machste ein "++" *gibts das in Java auch ?!*
    somit ist i2 = 13 im Extremfall, aber wenn das Array halt wie in C++
    nur von 0 bis 12 geht, hat man ein Problem. Aber warum es in C++
    nun geht, dass weiss nur ... äh der Compiler. :oops:
    (so wäre ich jetzt rangegangen - JAVA kenn ich nur beiläufig, soll ja
    nich der große Unterschied sein 8) )

    Edit - is das Pokerspiel dann irgendwo erhältlich :wink:
    Muss nur überlegen - 13 Karten ? von 2 bis 10 und B, D, K, A
    aha ! stimmt - kuhl - aber wenn Du Klassen benutzt ... hm
    irritiert es mich, dass Du son Array zusammenbaust - sowas
    hab ich auchma versucht für nen grafischen Taschenrechner,
    der nur Basic konnte - naja ... wahrscheinlich brauchste das
    zum Mischen ? Weil die Regeln von Poker sind schon was
    komplexer, als "Herz Ass" is größer als "Kreuz König".
    *oho - ich nerv grad wieder ... :arrow: *
  • Oh das mit der Speicherverwaltung scheint unter Java wohl bissel
    anders zu laufen. Aber mir is noch aufgefallen:

    card[i2].col = i;
    Die besagte Zeile, i hat doch als allererstes den Wert 0, wenn nun
    das linke Zeugs da einen Zeiger darstellt, dann isses ja logisch, dass
    dann der Compiler sagt: "böse, böse, der Zeiger zeigt auf 0" :P
    Aber wie gesagt - mir fehlt da paar Sterne und "Kaufmanns-und"s ...
    ähm.
  • nimm nochmal den "falschen" code und erstelle dazu diese Klasse mit Standardkonstruktor

    Quellcode

    1. class tCard {
    2. public int col=0;
    3. public int val=0;
    4. public tCard() {
    5. System.out.println("Jetzt wird das Objekt erstellt");
    6. }
    7. }


    klappt nicht & keine Ausgabe ;)
    Objekte werden in Java wohl erst bei Aufruf des Konstruktors erstellt.

    Kannst du das Beispiel mal in C++ probieren? Werden durch das Anlegen des Arrays schon 4*13 Objekte erstellt?
  • @zyklo:
    also die werte in den arrays dienen nur zur identifizierung, nicht zum Zusammenzählen :)
    und für i2=13 wird die for-schleife gar nicht ausgeführt, da die bedingung ja heißt "i2<13"
    und dass bei card[i2] als allererstes i und i2 den Wert 0 haben ist ja nicht schlimm, das heißt ja nicht, dass auf "0" gezeigt wird, sondern auf das erste erste (nullte) Element in dem Array.


    @boardchef alias donut:
    in c++ sieht der code ein bisschen anders aus, hier:

    Quellcode

    1. #include <iostream>
    2. using namespace std;
    3. class tCard
    4. {
    5. public:
    6. int col;
    7. int val;
    8. };
    9. void main()
    10. {
    11. int i=0, i2=0;
    12. tCard ** card;
    13. card = new tCard* [4];
    14. for(i=0; i<4; i++)
    15. {
    16. card[i] = new tCard[13];
    17. for(i2=0; i2<13; i2++)
    18. {
    19. card[i][i2].col = i;
    20. card[i][i2].val = i2+1;
    21. }
    22. }
    23. }
    Alles anzeigen


    und das funktionuckelt superbst.
    ich kenn mich mit java halt noch nicht so gut aus, aber was nicht ist, kann ja noch werden :-)
  • @phax: also du meinst vermutlich zeile 14: "card = new tCard*[4]"
    in meinem Java-Code sieht diese Zeile folgendermaßen aus:

    Quellcode

    1. tCard playCards[][] = new tCard[4][13];

    diese funktioniert auch einwandfrei, wenn ich jedoch das "new" dort herausnehme, funktioniert es aber nicht mehr (eclipse, java 1.5.0_06), er sagt dann "tCard cannot be resolved"
  • Also dass ist folgendermaßen:

    C++ Zeile 13:
    card = new tCard* [4];
    allokiert dir Speicher für 4 "tCard*" (also auf x86 Maschinen 4x4=16 Bytes)
    Das entspricht den 4 Zeilen. Dabei wird kein Konstruktor gerufen, da du nur Platz für weitere Pointer allokiert hast.
    Diese 4 Zeilen haben aber noch keinen Speicherbereich zugeordnet.
    Deshalb wird in C++ Zeile 16
    card = new tCard[13];
    für jede Zeile 13 Objekte vom Typ "tCard" allokiert (ohne Alignment auf x86, wobei int=32 Bit ergibt das 13*(4+4) = 104 Bytes).
    Hierbei wird 13 mal der Konstruktor (wenn einer existiert) von tCard gerufen.
    D.h in Summe hast du 16+(4*104)=432 Bytes allokiert.
    Soweit so klar?

    Java:
    Mittels "new tCard[4][13];" legst du ein Array mit Platz für 4*13=52 Objekte an (das sollten 4*52=208 Bytes sein (pointer = 4 Bytes))
    Anschließend wird in jedem Speicherbereich ein neues tCard Objekt angelegt.

    Deine Java Lösung würde in C++ ca. so aussehen:

    Quellcode

    1. void main()
    2. {
    3. int i=0, i2=0;
    4. tCard ** card;
    5. card = new tCard* [4][13];
    6. for(i=0; i<4; i++)
    7. {
    8. for(i2=0; i2<13; i2++)
    9. {
    10. card[i][i2] = new tCard ();
    11. card[i][i2].col = i;
    12. card[i][i2].val = i2+1;
    13. }
    14. }
    15. }
    Alles anzeigen


    hth
  • Und das kompiliert deiner so?

    Bei mir macht deine Zeile :

    Quellcode

    1. card = new tCard* [4][13];
    einen Fehler :
    error C2440: '=' : cannot convert from 'class tCard *(*)[13]' to 'class tCard ** '
    Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast


    Was nutzt du für einen Compiler?
    Gruß, Sascha