IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Ecrire et parcourir un tableau à plusieurs dimensions


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2016
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2016
    Messages : 33
    Par défaut Ecrire et parcourir un tableau à plusieurs dimensions
    Bonjour à vous,

    Dans le cadre d'un projet pour la spécialité ISN en terminale, je me suis lancé dans la programmation d'un jeu.
    Je suis confronté à un problème qui est le suivant:
    J'aimerais pouvoir inscrire les coordonnées d'une zone dans un tableau: c'est pourquoi j'ai pensé à utiliser un tableau à plusieurs dimensions.
    J'ai pour le moment écris le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    ...
    int[][] tabcp= new int [1][];
    int coord=0;
    ...
     while (cpg1 == cppd) {
    		 Color cpgg = new Color(image.getRGB(xg1, xg2));
    		 int pr22=cpgg.getRed();
    		 int pg22=cpgg.getGreen();
    		 int pb22=cpgg.getBlue();
    		 int cpg11 = new Color(pr22,pg22,pb22).getRGB();
    		 if (cpg11 != cppd) {
    			 break;
    		 }
    	 	 g.setColor(new Color(pr2,pg2,pb2));
    	 	 g.fillRect(xpg1, xpg2, 24, 24);
    	 	 g.fillRect(xg1, xg2, 24, 24);
    	 	 tabcp[0][coord]= xg1;
    	 	 tabcp[1][coord]= xg2;
    	 	 coord++;
    	 	 xpg1-=25;
    	 	 xg1-=25;
    	 	 cpg1=cpg11;
    		 }
    Ici, je souhaiterais inscrire xg1 et xg2 dans le tableau avec xg1 dans une première colonne et xg2 dans une seconde, seulement j'obtient l'erreur:
    -Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException.

    Je ne suis pas très à l'aise avec les tableaux, mais je n'ai pas trouvé d'autres solutions, c'est pourquoi j'aurais besoins de conseils.

    Merci d'avance

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Quand tu écris int[][] tabcp= new int [1][];, tu indiques que le tableau a 1 ligne, mais chaque ligne n'est pas encore initialisée, d'où la NullPonterException.
    C'est exactement comme si tu écrivais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class Truc {
        private int[] tableau;
        public void machin() {
              tableau[0]=1; // NullPointerException ici
        }
    }
    Il est indispensable d'indiquer le nombre d'élements de chaque dimension avant de mettre des valeurs dans le tableau. Il te faut donc connaitre le nombre d'élements d'avance, ou savoir le calculer. Tu peux bien sûr procéder en 2 temps :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Truc {
        private int[][] tableau=new int[10][];
     
        public void machin() {
              for(int i=0; i<tableau.length; i++) {
                   tableau[i]=new int[i+1];
                   // là on peut mettre des valeurs dans le tableau
              }
        }
     
    }
    Si tu ne peux pas facilement déterminer la taille du tableau d'avance, il te faudra utiliser une List, et la transformer en tableau après l'avoir remplie. Ou utiliser un tableau de List.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2016
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2016
    Messages : 33
    Par défaut
    Merci pour ta réponse, j'ai donc modifié mon programme en ajoutant le nombre de ligne et un compteur coord:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int[][] tabcp= new int [1][100];
    	  int coord=0;
    J'ai ensuite voulu écrire dans le tableau xg1 et xg2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     if (xg1 >=0) {
    			 Color cpg = new Color(image.getRGB(xg1, xg2));
    			 int pr2=cpg.getRed();
    			 int pg2=cpg.getGreen();
    			 int pb2=cpg.getBlue();
    			 int cpg1 = new Color(pr2,pg2,pb2).getRGB();
     
    		 while (cpg1 == cppd) {
    		 Color cpgg = new Color(image.getRGB(xg1, xg2));
    		 int pr22=cpgg.getRed();
    		 int pg22=cpgg.getGreen();
    		 int pb22=cpgg.getBlue();
    		 int cpg11 = new Color(pr22,pg22,pb22).getRGB();
    		 if (cpg11 != cppd) {
    			 break;
    		 }
    	 	 g.setColor(new Color(pr2,pg2,pb2));
    	 	 g.fillRect(xpg1, xpg2, 24, 24);
    	 	 g.fillRect(xg1, xg2, 24, 24);
    		 for(int i=0; i<tabcp.length; i++) {
                 tabcp[i]=new int[i+1];
                 tabcp[i][coord]= xg1;
                 tabcp[i][coord]= xg2;
    		 }
    		 coord++;
    	 	 xpg1-=25;
    	 	 xg1-=25;
    	 	 cpg1=cpg11;
    		 }
    		 }
    J'ai voulu ensuite afficher le contenu du tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for(int i = 0; i < tabcp.length; i++)
            {    
              for(int j = 0; j < tabcp[i].length; j++)
              {
                System.out.print(tabcp[i][j]);       
              }
              System.out.println("");     
            }
    Seulement si ma boucle while tourne plus d'une fois, j'obtient l'erreur "java.lang.ArrayIndexOutOfBoundsException" et si la boucle tourne une fois, une seule des deux coordonnées sont inscrites.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    1)
    Retire le tabcp[i]=new int[i+1]; : c'était pour l'exemple que j'ai montré ça. Dans ton cas, tu dimensionnes le tableau par int[][] tabcp= new int [1][100];, ce qui fait un tableau d'une ligne de 100 colonnes.

    Ensuite, lorsque tu écris dans le tableau, tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tabcp[i][coord]= xg1;
    tabcp[i][coord]= xg2;
    Donc tu mets (la valeur de) xg1 dans tabcp[i][coord], puis tu mets xg2 aussi dans tabcp[i][coord], qui remplace donc xg1.

    Il faut que tu dimensionnes ton tableau par int[][] tabcp= new int [2][100]; : 2 lignes de 100 colonnes. Et que tu fasses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tabcp[0][coord]= xg1;
    tabcp[1][coord]= xg2;
    à la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(int i=0; i<tabcp.length; i++) {
                 // à supprimer tabcp[i]=new int[i+1];
                 tabcp[i][coord]= xg1;
                 tabcp[i][coord]= xg2;
    		 }
    Remarque qu'il serait plus logique de faire (même si ça ne change pas grand chose) int[][] tabcp= new int [100][2]; et donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tabcp[coord][0]= xg1;
    tabcp[coord][1]= xg2;
    Tu pourrais également utiliser un tableau de Point :
    Point[] tabcp = new Point[100];et faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tabcp[coord]= new Point( xg1, xg2 );
    2)Ensuite le second problème vient du fait que tu fais évoluer coord de manière indépendant de la taille du tableau (au lieu de faire une incrémentation entre 0 et la taille du tableau).
    La première conséquence que ça a, c'est que, comme tu as oublié de réinitialiser coord à 0 lorsque tu appelles la boucle une seconde fois, je suppose que coord atteint 100 et donc tu tentes d'écrire en dehors du tableau, et donc tu obtiens une IndexOutOutBoundException (Index en dehors des limites).
    La second conséquence c'est que si dans une boucle tu avais plus de 100 paires de coordonnées tu obtiendrais la même exception. C'est là toute la limite dans l'usage des tableaux : avoir une taille finie qu'il ne faut pas dépasser. Il faut donc éviter de faire ce que tu fais, ou alors prendre les précautions qui s'imposent : mémoriser le nombre d'éléments écrits dans le tableau (s'il y en a moins que sa taille, tu as des cellules avec des données incohérentes, il ne faut donc pas les prendre en compte), et empêcher tout dépassement, ou "agrandir" le tableau le cas échéant : créer un nouveau tableau plus grand, copier le premier dedans, et remplacer le premier par le nouveau, ce que fait tout seule une ArrayList pour toi.

    Ainsi, pour la déclaration, tu peux écrire List<Point> tabcp = new ArrayList<>();Pour écrire dedans, au début de chaque boucle tabcp.clear(); pour vider le tableau, puis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tabcp.add( new Point(xg1, xg2) );[/c]
    Pour afficher ensuite, tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(int i=0; i<tabcp.size(); i++) {
        System.out.print(tabcp.get(i).x+" "+tabcp.get(i).y+" ");       
    }
    System.out.println();
    Ou encore (l'index ne sert à rien pour cet affichage) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(Point p : tabcp) {
        System.out.print(p.x+" "+p.y+" ");       
    }
    System.out.println();
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2016
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2016
    Messages : 33
    Par défaut
    J'ai en fait fait une erreur, quand j'ai mis 100 colonnes, je pensais ne pas avoir à toutes les remplir.
    Le problème étant que le nombre de coordonnées à inscrire dans le tableau tient de l'aléatoire. J'ai fait une arrayList comme tu l'a expliqué, mais je n'ai rien qui sort, j'ai donc du faire une autre erreur..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    public class ListenerBleuC extends JPanel{
     
        private final BufferedImage image;
    	  int xp1=1, xp2=1;
    	  int xpg1=1, xph1=1, xpb1=1, xpd1=1, xpg2=1, xpd2=1, xph2=1, xpb2=1;
    	  int xg1=xpg1-25, xg2=xpg2;
    	  int xd1=xpd1+25, xd2=xpd2;
    	  int xh1=xph1, xh2=xph2-25;
    	  int xb1=xpb1, xb2=xpb2+25;
    	  List<Point> tabcp = new ArrayList<>();
    	  int cppd = -16776961;
     
        public ListenerBleuC(BufferedImage image) {
            this.image=image;
            System.out.println("HelloB");
            eerc();
            for(int i=0; i<tabcp.size(); i++) {
                System.out.print(tabcp.get(i).x+" "+tabcp.get(i).y+" ");       
            }
            System.out.println();
    	}
    public void eerc() {
     
    if (xg1 >=0) {
    			 Color cpg = new Color(image.getRGB(xg1, xg2));
    			 int pr2=cpg.getRed();
    			 int pg2=cpg.getGreen();
    			 int pb2=cpg.getBlue();
    			 int cpg1 = new Color(pr2,pg2,pb2).getRGB();
     
    		 while (cpg1 == cppd) {
    		 tabcp.clear();
    		 Color cpgg = new Color(image.getRGB(xg1, xg2));
    		 int pr22=cpgg.getRed();
    		 int pg22=cpgg.getGreen();
    		 int pb22=cpgg.getBlue();
    		 int cpg11 = new Color(pr22,pg22,pb22).getRGB();
    		 if (cpg11 != cppd) {
    			 break;
    		 }
    	 	 g.setColor(new Color(pr2,pg2,pb2));
    	 	 g.fillRect(xpg1, xpg2, 24, 24);
    	 	 g.fillRect(xg1, xg2, 24, 24);
    		 tabcp.add(new Point(xg1, xg2));
    	 	 xpg1-=25;
    	 	 xg1-=25;
    	 	 cpg1=cpg11;
    		 }
    		 }

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     while (cpg1 == cppd) {
    		 tabcp.clear();
    /*...*/
    Tu vides la liste à chaque itération de la boucle, puis que le clear() est exécuté dans la boucle.

    Fais comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    tabcp.clear(); // on vide la liste
    while (cpg1 == cppd) {
            /*... on remplit la liste dans la boucle ...*/
     
    }
    /*... la liste est remplie ...*/
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Initialisation d'un tableau à plusieurs dimensions
    Par kinouseb dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/02/2007, 13h16
  2. problème avec un tableau à plusieurs dimensions
    Par lelutin dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 07/09/2006, 12h05
  3. Réponses: 3
    Dernier message: 26/05/2006, 19h49
  4. Réponses: 7
    Dernier message: 19/01/2006, 18h57
  5. tableau à plusieurs dimensions
    Par pekka77 dans le forum C
    Réponses: 11
    Dernier message: 07/02/2005, 19h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo