Erreur compilation - simple code java

Bonjour tout le monde,
Pouvez svp voir mon modeste code ci-après et me dire où ça cloche ? je n’arrive pas à le compiler… Merci d’avance

public class Matrice{

    int M[][]=null;
    
    Matrice(int n)      // constructeur a un seul argument pour declarer la matrice
   {
     M = new int[n][n];
   } 

    /* Methode multiplie(int k) */

  public int [] [] multiplie(int k)
  {
     int i,j;
    
     for(i=0;i<M.length;i++){
        for(j=0;j<M.length;j++) {M[i][j] = k*M[i][j];}
     }  

     return M;
   }

    /* Methode somme(int N[][]) */

  public int [] [] somme(int N[][])
  {
     int i,j;
     int somme[][]=null;

     if(N.length!= M.length) { System.out.println("Cette matrice doit avoir la meme taille que la premiere..");
                       somme = null;
                     }
     else
       for(i=0;i<M.length;i++){
        for(j=0;j<M.length;j++) {somme[i][j] = M[i][j]+N[i][j];}
      }  

     return somme;
   }
    

   /* Methode affiche() */
 
   public void affiche()
   {
     int i,j;

     for(i=0;i<M.length;i++){
        for(j=0;j<M.length;j++) {System.out.print("-"+M[i][j]);}    // impression du tableau
     }
    }    

   /* Methode main() */

   public static void main(String [] args)
   {
    
     int i,j,n,p;                   // Declaration et initialisation des tailles des tableaux
	 n=args.length;             // Nombre d'argument
         p=(int) Math.sqrt(n);
     
     Matrice M = new Matrice(p);

     for(i=0;i<p;i++){
        for(j=0;j<p;j++) {M[i][j] = Integer.parseInt(args[p*i+j]);} // remplissage de la matrice
     }  

     System.out.println("\n La matrice est : ");
     M.affiche();
      
     M.multiplie(2); // appel de la methode multiplie(); */
     System.out.println("\n La matrice multipliee par 2 est : ");
     M.affiche();
     
    } 
}   

Salut,

Quelle est le message d’erreur pendant la compilation ?

int M[][]=null;

Déjà, int[][] M.

Pour le reste, plein d’erreurs non graves, mais qui en Java font tâches.

L’erreur que le compilateur renvoit est la suivante :


javac Matrice.java
Matrice.java:65: array required, but Matrice found
        for(j=0;j<p;j++) {M[i][j] = Integer.parseInt(args[p*i+j]);} // remplissage de la matrice
                           ^
1 error

C:\codesjava>

Merci

Type de M:

Matrice M = new Matrice§;

for(i=0;i<p;i++){
for(j=0;j<p;j++) {M[i][j] = Integer.parseInt(args[p*i+j]);} // remplissage de la matrice
}

Re
Merci pour vos réponse, mais le problème persiste :
dans la classe Matrice, il y a la methode (constructeur) :

 Matrice(int n) // constructeur a un seul argument pour declarer la matrice
 {
 M = new int[n][n];
 } 

elle permet donc de creer une matrice carrée.

Dans la méthode main() j’ai déclaré un objet (de type matrice) :

Matrice M = new Matrice(p);

Je suppose donc qu’une matrice carrée M sera créee et quand je vais appliquer les instructions suivantes :

for(i=0;i<p;i++){
for(j=0;j<p;j++) {M[i][j] = Integer.parseInt(args[p*i+j]);} // remplissage de la matrice
}

je suppose que ma matrice sera remplie des valeurs parametres de main. Pourquoi alors cette non compatibilité de type (array#Matrice)
Merci

tu as certaimenemt un conflit entre tes deux M… Celui declare comme membre de ta classe, et ta variable dans main… Peut-etre que tu n’en as pas… mais cest tres risque.

Ensuite pour pouvoir faire M[i][j] sur un objet de type Matrice, il faut surcharger l’operateur []. (n’etant pas expert en Java… je ne sais pas si ca peut se faire…). La pratique voudrais que tu fasse deux methodes du genre :

public int GetElement(int i, int j) { return M[i][j]; }
public void SetElement(int i, int j, int val) { M[i][j] = val; }

La non compatibilite est donc normale. Tu es en train de sous-entendre que parceque tu as un membre int[][] dans ta classe Matrice alors forcement un objet de type Matrice est directement un tableau. Ce n’est biensur pas le cas. Java n’a aucun moyen de savoir que quand tu fais M[i][j] tu veux en fait acceder a l’element i,j du tableau a l’interieur de l’objet M de type Matrice (encore une fois les noms sont conflictuels et ne t’aident pas). Donc il faut lui dire explicitement, soit en surchargant l’operateur [] (si cest faisable) soit en ajoutant les deux petits methodes que je t’ai mis au-dessus.

Enfin, comme tu es en train de faire de la programmation objet… autant te servir des classes que tu defini. Par exemple ta methode somme devrait prendre une Matrice en parametre et non pas un int[][]. Si ton objet est bien implemente tu ne devrais pas avoir a acceder au tableau d’int a l’interieur directement.

J’espere t’avoir aide. Si t’as besoin de clarifications n’hesite pas.

Non. Pas de surcharge d’opérateur (sic).

Ton code est faux:

for(i=0;i<p;i++){
for(j=0;j<p;j++) {M[i][j] = Integer.parseInt(args[p*i+j]);} // remplissage de la matrice
}

Remplace par:

for(i=0;i<p;i++){
for(j=0;j<p;j++) {M.M[i][j] = Integer.parseInt(args[p*i+j]);} // remplissage de la matrice
}

Ou initialise ça dans le constructeur.

Re Les pro-mecs :wink:
Vous avez tous les deux raison, effectivement je croyais qu’un objet matrice est automatiquement un tableau à 2 dimensions, alors il a fallu l’expliciter par :

Matrice Mat = new Matrice(p);
     
     for(i=0;i<p;i++){
        for(j=0;j<p;j++) {Mat.M[i][j] = Integer.parseInt(args[p*i+j]);} // remplissage de la matrice
     }  

et puis manipuler le tableau (matrice) en l’affichant

System.out.println("\n La matrice est : ");
     Mat.affiche();

et le multipliant etc…

Mat.multiplie(2); // appel de la methode multiplie();
     System.out.println("\n La matrice multipliee par 2 est : ");
     Mat.affiche();

et voici un exemple d’éxecution :


C:\codesjava>java Matrice 10 11 12 13 14 15 16 17 18 19

 La matrice est :
 10 11 12
 13 14 15
 16 17 18

 La matrice multipliee par 2 est :
 20 22 24
 26 28 30
 32 34 36

Merci infiniment…

Re
Autre question SVP…
Comment est ce que je peux utiliser une classe que j’ai crée au préalable (ces méthodes) dans une nouvelle classe.
Exemple :
supposons que j’ai une classe Util.java dans un repertoire C:\codesjava (Util contient la methode lire())
et je veux créer une classe Test.java :

public class Test {

int n,..;
Util.lire();
....
....

}
J’ai des problèmes de genre :
Test.java:12: cannot find symbol
symbol : method lire()(java.lang.String)
location: class Test

Comment est ce que je dois procéder, j’ai ajouter un : import codesjava*.java ----> sans résultats
J’ai même indiqué le chemin de (Util.java) à la compilation :
javac -classpath c:\codesjava\Util.java Test.java ----> également sans résultats…
Merci d’avance pour vos réponses.

Hum. Tu apprends Java par toi même?

Dans ton classpath, tu ne dois pas fournir le fichier source, mais un dossier contenant des fichiers *.class.

Informe toi sur Eclipse, ou Ant pour te faciliter la tâche.

public class Util
{
public static void lire()
{
//blabla
}
}

public class Test
{
public int blabla()
{
Util.lire();
}
}

Si tu met les deux fichiers dans le meme rep Java se debrouille.

Sinon ca doit plutot etre comme ca : javac -classpath c:\codesjava\ Test.java
Edité le 24/04/2008 à 17:58

En quelque sorte oui, je poursuis une formation à distance, et donc je suis obligé de résoudre plein de trucs seul quand il n y a pas de réactivité vis à vis de mes collègues…

Dans ton classpath, tu ne dois pas fournir le fichier source, mais un dossier contenant des fichiers *.class.

Informe toi sur Eclipse, ou Ant pour te faciliter la tâche

Pour mon problème, c’est bon c’est résolu grace à vous (merci bcp…), j’ai tout mis dans le même repertoire et j’ai crée le fichier .class de la 1ère classe (et non pas le fichier source que vous l’avez mentionnée), donc la compilation a reussi sans pour autant dicter tout le path.
Mercii

Re salut les amis,
J’ai un autre de souci de formulation d’une méthode java, la méthode sert pour remplir aleatoirement un tableau de byte (0 ou 1) mais avec un nombre de (1) précisé.
la taille du tableau est connu (n)
le nombre de (1) dans le tableau est connu aussi §
J’ai procédé ainsi :


/* public void affecteTableau() */
  { 
     int i, position;
     for(i=0;i<p;i++)
     {
           position=(int) (Math.random()*n);
           tabBateau[position]=1;
    }

le problème est que si jamais une position a été retire plus qu’une seule fois, j’aurais moins de (1) que demandé.
Merciii

Bah, vérifie ce qu’il y a dans ton tableau?

Random t = new Random();
for (int i = 0; i < p; ) {
  int j = t.nextInt(tabBateau.length);
  if (tabBateau[j] == 0) {
     tabBateau[j] = 1;
     ++i;
  }
}

Vraiment bravo et merci, j’ai pas eu cette idée de n’incrémenter que si la case est nulle, j’ai reformuler mon truc comme suit :


public void affecteTableau()
  { 
     int j;
     for(int i=0;i<p;)
     {
           j=(int) (Math.random()*n);
           if((tab[j])==0)
               {
                   tab[j]=1;
                   ++i;
               }
     }
  }

Desolé, l’indention dans le message (pour rendre le code plus laisible) ne marche pas pour moi… ?!!

Faut mettre des tabulations… laisse tomber, c’est un “bug” du forum :confused: