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

avec Java Discussion :

Erreur de compilation avec Java


Sujet :

avec Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 69
    Points : 25
    Points
    25
    Par défaut Erreur de compilation avec Java
    Bonjour,
    J'ai un petit souci lors de la compilation d'un algo pour générer des valeurs aléatoires dans une matrice. Je ne vois pas d'où vient le problème.

    Voici le code :

    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
    // Génération aléatoire de valeurs.
    public class generaleatoire{
        public static final int MAX= 20 ;
     
     
          public static void creation(int[][]mat){
          int i,j;
          int N=mat.length;
          int M=mat.length;
     
          for(i=0;i<N;i++){
              for(j=0;j<M;j++){
           System.out.print(mat[i][j]+"\t");
              }
                System.out.println();
            }
          }
     
          public static void remplissagemat(int[][]mat){
          int i,j,cpt;      
    	cpt=0;
    	while(cpt!=5){
    		i=(int) (Math.random()*(MAX+1));
    		j=(int) (Math.random()*(MAX+1));
     
    	if (mat[i][j]=0){
    		mat[i][j]=(int) (Math.random()*(MAX+1));
    		cpt=cpt+1;
     
            }
          }
        }
     
     
    //Programme principal.
      public static void main(String [] args){
      System.out.println("Donnez la taille du plateau en commencant par le nombre de lignes puis en second le nombre de colonnes");
      int N=Clavier.readInt();
      int M=Clavier.readInt();
      int[][] mat1= new int[N][M];
      System.out.println("Le plateau est le suivant :");
      remplissagemat(mat1);
      creation(mat1);
      }
    }
    Merci d'avance pour votre aide. Bon dimanche.

  2. #2
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Tu peux preciser ou est l'erreur et quel est elle ? ma boulle de cristal est au SAV

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 69
    Points : 25
    Points
    25
    Par défaut
    Voici l'erreur :
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 16
    at generaleatoire.remplissagemat(generaleatoire.java:22)
    at generaleatoire.main(generaleatoire.java:37)

    Merci d'avance.

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 50
    Points : 60
    Points
    60
    Par défaut
    Cette erreure t'indique que tu cherche a acceder un élément de ton tableau qui n'existe pas car tu es est allé trop loin dans l'incrémentation de tes indices.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	while(cpt!=5){
    		i=(int) (Math.random()*(MAX+1));
    		j=(int) (Math.random()*(MAX+1));
     
    	if (mat[i][j]=0){
    		mat[i][j]=(int) (Math.random()*(MAX+1));
    		cpt=cpt+1;
     
            }
    L'erreur vient vraisemblablement du choix de ton i et de ton j.

    Tules choisis entre 1 et 20 alors que ta matrice peut etre bien differente.

    tu devrait avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	while(cpt!=5){
    		i=(int) (Math.random()*(N+1));
    		j=(int) (Math.random()*(M+1));
     
    	if (mat[i][j]=0){
    		mat[i][j]=(int) (Math.random()*(MAX+1));
    		cpt=cpt+1;
     
            }
    Ca devrait mieux marcher.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 69
    Points : 25
    Points
    25
    Par défaut
    Merci beaucoup je vais essayer. Sinon pour l'edit De mon message je serai prudent par la suite merci. Bonne soirée.

  6. #6
    Membre habitué Avatar de bobmidou
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2008
    Messages : 121
    Points : 149
    Points
    149
    Par défaut
    Salut

    Ton i et j prennent des valeurs supérieur à N et M
    voici une autre façon:
    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
     
    public class generaleatoire{
        public static final int MAX = 20 ;
     
     
          public static void creation(int[][]mat){
          int i,j;
          int N=mat.length;
          int M=mat.length;
     
          for(i=0;i<N;i++){
              for(j=0;j<M;j++){
           System.out.print(mat[i][j]+"\t");
              }
                System.out.println();
            }
          }
     
          public static void remplissagemat(int[][]mat)
          {
          	int i,j;
          	int N=mat.length;
          	int M=mat.length;      
     
    	  for(i=0;i<N;i++)
    	  {
              for(j=0;j<M;j++)
              {
              	mat[i][j]=(int) (Math.random()*MAX)+1;
              }
          }
        }
     
     
    //Programme principal.
      public static void main(String [] args){
      System.out.println("Donnez la taille du plateau en commencant par le nombre de lignes puis en second le nombre de colonnes");
      int N=Clavier.readInt();
      int M=Clavier.readInt();
      int[][] mat1= new int[N][M];
      System.out.println("Le plateau est le suivant :");
      remplissagemat(mat1);
      creation(mat1);
      }
    }
    Bonne chance

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 69
    Points : 25
    Points
    25
    Par défaut
    Merci mais je voudrais dans mon cas que tout le tableau ne soit pas remplis... Je voudrais qu'il y ait seulement 5 cases qui soient remplis par exemple et toutes les autres contiennent des 0... Je ne l'ai pas encore essayé mais je ne vois pas de limitations avec votre algo...
    Bonne journée.

  8. #8
    Membre confirmé Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Points : 565
    Points
    565
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (mat[i][j]=0){
    		mat[i][j]=(int) (Math.random()*(MAX+1));
    		cpt=cpt+1;
     
            }
    me pose souci pour 2 raisons ...
    1/ a moins que je régresse et que je confonde avec d'autres langages ( et c'est possible hein ) il s'agit d'une affectation et non d'un test ...
    ecris plutot mat[i][j] == 0
    2/ Ta matrice n'est pas définie à 0 au départ il me semble. Ce n'est pas parce que tu fais un int[][] mat1= new int[N][M]; que les cases de ton plateau sont d'office à 0 ...


    Personnellement j'aurais créé un classe Matrice avec un contructeur qui remplit de 0 (ou de nombre aléatoire comme tu veux )


    PS: par habitude je te conseille d'écrire la phrase " Votre plateau est le suivant" apres création et remplissageMat ( je ne sais d'ailleurs pas a quoi sert creation) et de créer une méthode afficherMatrice qui s'occupe de ca

  9. #9
    Membre éprouvé
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Points : 935
    Points
    935
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int N=mat.length;
    int M=mat.length;
    donne N=M !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int[][] test = new int[10][20];
    System.out.println(test.length);
    if(test.length>0) {
    	System.out.println(test[0].length);
    }
    donne

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par miloux32 Voir le message
    2/ Ta matrice n'est pas définie à 0 au départ il me semble. Ce n'est pas parce que tu fais un int[][] mat1= new int[N][M]; que les cases de ton plateau sont d'office à 0 ...
    Bah si, jusqu'a preuve du contraire, un entier non initialisé vaut 0, et un tableau d'objets utilise les valeurs par défaut pour s'initialiser.

  11. #11
    Membre confirmé Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Points : 565
    Points
    565
    Par défaut
    Citation Envoyé par Wydicule Voir le message
    Bah si, jusqu'a preuve du contraire, un entier non initialisé vaut 0, et un tableau d'objets utilise les valeurs par défaut pour s'initialiser.
    Mes souvenirs doivent dater alors mais bon j'ai toujours gardé l'habitude d'initialiser explicitement mes variables on comprend mieux ce qu'on fait comme ça je trouve . ( et je me méfie des matrices et de l'initialisation par habitude :p )

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 69
    Points : 25
    Points
    25
    Par défaut
    En essayant toutes les méthodes ca ne marche toujours pas... Une matrice est toujours initialisée à 0. fnobb je ne comprends pas où tu veux en venir...

  13. #13
    Membre confirmé Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Points : 565
    Points
    565
    Par défaut
    Citation Envoyé par Javabad Voir le message
    En essayant toutes les méthodes ca ne marche toujours pas... Une matrice est toujours initialisée à 0. fnobb je ne comprends pas où tu veux en venir...

    Reprend ce que tu as écrit :

    Ta matrice est de taille N*M ( mettons N= 5, et M = 6 pour l'exemple)
    Or dans ton exemple tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	i=(int) (Math.random()*(MAX+1));
    		j=(int) (Math.random()*(MAX+1));
     
    	if (mat[i][j]=0){
    		mat[i][j]=(int) (Math.random()*(MAX+1));
    		cpt=cpt+1;
    avec MAX = 20
    Donc tu peux obtenir plus que 5 et 6 ....

    Donc 2 solutions si tu veux des sous matrices :
    - Tu initialises ta matrice de taille MAX*MAX et tu travailles sur ue nsous matrice N*M (que tu passes en paramètres )
    - Soit tu changes la méthode de calcul de i et j



    De plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int N=mat.length;  // renvoie 5 dans notre cas 
    int M=mat.length;  // renvoie aussi 5 alors qu'on veut 6 !!!! voir fnobb

  14. #14
    Membre éprouvé
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Points : 935
    Points
    935
    Par défaut
    Il me semblais que c'était clair
    En initialisant tes variables
    dans la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
          public static void remplissagemat(int[][]mat)
          {
          	int i,j;
          	int N=mat.length;
          	int M=mat.length;      
     
    	  for(i=0;i<N;i++)
    	  {
              for(j=0;j<M;j++)
              {
              	mat[i][j]=(int) (Math.random()*MAX)+1;
              }
          }
    en initialisant les variables N et M de la même façon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int N=mat.length;
    int M=mat.length;
    tu sous entend que la matrice est carrée si elle n'est pas tu (par exemple int[20][16])
    quand tu la parcours pour initialiser ses données (boucle j) tu fini par faire un mat[i][16] d'où un ArrayIndexOutOfBoundsException

    le problème vient de la façon dont est calculé M (c'est pas mat.length mais mat[0].length) voir l'exemple de code

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 69
    Points : 25
    Points
    25
    Par défaut
    Merci j'ai en effet trouvé pour une matrice carrée et ca marche. Mais c'est vrai que ca ne marche pas pour une matrice non carrée... Donc j'ai essayé avec votre méthode. J'ai bien un affichage de la grille sans souci mais j'ai toujours un message d'erreur...

    Voici mon code modifié :
    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
    // Génération aléatoire de valeurs.
    public class generaleatoirejuste{
        public static final int MAX= 20 ;
     
     
          public static void creation(int[][]mat){
          int i,j;
          int N=mat[0].length;
          int M=mat[0].length;
     
          for(i=0;i<N;i++){
              for(j=0;j<M;j++){
           System.out.print(mat[i][j]+"\t");
              }
                System.out.println();
            }
          }
          public static void remplissagemat(int[][]mat,int n,int m){
          int i,j,cpt;      
    	cpt=0;
    	while(cpt!=5){
    		i=(int) (Math.random()*((n-1)+1));
    		j=(int) (Math.random()*((m-1)+1));
     
    	if (mat[i][j]==0){
    		mat[i][j]=(int) (Math.random()*(MAX+1));
    		cpt=cpt+1;
     
            }
          }
        }
     
    //Programme principal.
      public static void main(String [] args){
      System.out.println("Donnez la taille du plateau en commencant par le nombre de lignes puis en second le nombre de colonnes");
      int N=Clavier.readInt();
      int M=Clavier.readInt();
      int[][] mat1= new int[N][M];
      System.out.println("Le plateau est le suivant :");
      remplissagemat(mat1,N,M);
      creation(mat1);
      }
    }
    Merci.

  16. #16
    Membre éprouvé
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Points : 935
    Points
    935
    Par défaut
    l'erreur est la même

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
          int N=mat[0].length;
          int M=mat[0].length;
    c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          int N=mat.length;
          int M=mat[0].length;

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 69
    Points : 25
    Points
    25
    Par défaut
    En effet merci. Le problème est résolu. Bonne journée.

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 69
    Points : 25
    Points
    25
    Par défaut
    Une petite derniere question en fait : si je veux que ce soit l'utilisateur Qui donne le nombre d'objets qu'il veut, il me suffit de lui faire saisir une valeur A par exemple dans le programme principal et de faire while(cpt!=A) ?
    Merci.

    Edit : C'est bon en fait merci.

  19. #19
    Membre confirmé Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Points : 565
    Points
    565
    Par défaut
    Citation Envoyé par Javabad Voir le message
    Une petite derniere question en fait : si je veux que ce soit l'utilisateur Qui donne le nombre d'objets qu'il veut, il me suffit de lui faire saisir une valeur A par exemple dans le programme principal et de faire while(cpt!=A) ?
    Merci.
    oui a conditiion bien sur de le passer en argument de ta fonction

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 69
    Points : 25
    Points
    25
    Par défaut
    Oui c'est bon merci beaucoup. A bientot.

Discussions similaires

  1. Erreur de compilation rapport java avec Jasper report
    Par Sylvies209 dans le forum NetBeans
    Réponses: 6
    Dernier message: 31/07/2010, 14h22
  2. Erreur de connexion avec Java
    Par webmister dans le forum Connexions aux bases de données
    Réponses: 3
    Dernier message: 27/03/2006, 12h59
  3. Erreur de compil avec Outp
    Par sixon dans le forum C++
    Réponses: 2
    Dernier message: 27/02/2006, 15h01
  4. Erreur de compilation avec SWITCH et CASE
    Par barbarello dans le forum C++
    Réponses: 4
    Dernier message: 21/01/2006, 21h47
  5. [FreePascal]Erreur de compilation avec Dev-Pascal
    Par youngeikichi dans le forum Free Pascal
    Réponses: 3
    Dernier message: 17/02/2005, 14h22

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