Problème de pointeur avec l'utilisation d'un objet dans un objet

Résolu/Fermé
JeryVG Messages postés 6 Date d'inscription mercredi 21 mars 2018 Statut Membre Dernière intervention 16 février 2019 - 16 févr. 2019 à 19:51
JeryVG Messages postés 6 Date d'inscription mercredi 21 mars 2018 Statut Membre Dernière intervention 16 février 2019 - 16 févr. 2019 à 20:35
Bonjour,
je suis nouveau en programmation, je suis entrain de faire une sorte de travail sur une librairie et j'ai quelque lacune avec les pointeurs.
Lorsque je les utilisent allant d'un objet vers un autre objet je pense que je n'ai pas de problème.
Mais lorsque je dois faire des pointeurs d'un objet sur lui même là sa pose des problèmes, surtout quand je dois perdre la référence de certain champ dans le constructeur:

comme par exemple

public class FaireTableau {
	public int tableau[];
	public int taille;
	public int index;
	
	public FaireTableau(int[] tab) {
		this.taille=tab.length;
		tableau=new int [this.taille];
		for(int i =0;i<tab.length-1;i++) {
			this.tableau[i]=tab[i];
		}
	}
	
	public FaireTableau(FaireTableau FT) {
		taille=FT.tableau.length;
		tableau=new int [this.taille];
		//recopie du tableau sans la référance
		for(int i =0;i<FT.tableau.length-1;i++) {
			this.tableau[i]=FT.tableau[i];
		}
	}


dans mon 2e constructeur je fais une recopie du tableau pour faire en sorte que les changement de l'un n'affecte pas l'autre.

C'est une des conséquence que je veux, mais il y a aussi des fois ou je veux que ces deux tableaux changent. Mais je suis restreint et ne peut changer les signatures des classes et de ces méthodes. Mais je peux ajouter des champs et créer de nouvelle méthode et classe.


voici un exemple de classe:

package exemple;

public class FaireTableau {
	public int tableau[];
	public int taille;
	public int index;
	
	public FaireTableau(int[] tab) {
		this.taille=tab.length;
		tableau=new int [this.taille];
		for(int i =0;i<tab.length-1;i++) {
			this.tableau[i]=tab[i];
		}
	}
	
	public FaireTableau(FaireTableau FT) {
		taille=FT.tableau.length;
		tableau=new int [this.taille];
		//recopie du tableau sans la référance
		for(int i =0;i<FT.tableau.length-1;i++) {
			this.tableau[i]=FT.tableau[i];
		}
	}
	
	public FaireTableau copie() {
		FaireTableau faireT=new FaireTableau(this.tableau);
		faireT.tableau=this.tableau; //garder la referance du talbeau
		faireT.index=this.index;	 //garder la referance des indice du tableau
		
		return new FaireTableau(faireT);
	}
	
	public void mettreTableauAJour(int index, int valeur_Mettre) {
		FaireTableau copi =new FaireTableau(this.tableau);
		
		copi.tableau=this.tableau;
		copi.tableau[index]=valeur_Mettre;
		this.tableau=copi.tableau;
		
	}
}


les signature des méthode à ne pas changer sont mettreTableauAjour, les constructeurs et copi.


Ma première idée c'était de mettre un champ boolean qui me permettait de dire quand est-ce que je peux faire en sorte que les deux tableau est la même référence, mais cette idée ne marchera pas, car d'après les constructeurs, je n'aurais pas de contrôle sur ce champs ( impossible de savoir quand est ce que ce champ sera a true ou false).

Ma seconde idée c'était de faire en sorte dans la classe mettre a jour une méthode qui permettait de modifier la valeur dans le tableau et d'envoyer le tableau dans le prochain objet.

Mais sa ne marche pas, lorsque je fais des changement dans mon tableau, tout les tableaux qui devraient pointer sur le même tableau ne change pas.

public class Main {
	public static void main(String[]	variable) {
		int[]	tableau= {0,1,2,3,4,5,6,7,8,9};
//les tableaux FT et FT2 doivent être lié
		FaireTableau FT = new FaireTableau(tableau);
		FaireTableau FT2 = FT.copie();
//le tableau FT3 n'est aps lié au deux autres tableaux
		FaireTableau FT3 = new FaireTableau(FT);			
		
		FT.mettreTableauAJour(3,5);
		FT.mettreTableauAJour(6,5);
		System.out.println("tableau de FT: ");
		for(int i =0 ; i<FT.tableau.length-1;i++) {
			
			System.out.print(FT.tableau[i]);//devrait afficher 0,1,2,5,4ln,5,5,7,8,9
		}
		System.out.println("");
		System.out.println("tableau de FT2: ");
		for(int j =0 ; j<FT2.tableau.length-1;j++) {
			System.out.print(+FT2.tableau[j]);//devrait afficher 0,1,2,5,4,5,5,7,8,9
		}
		System.out.println("");
		System.out.println("tableau de FT3: ");
		for(int k =0 ; k<FT3.tableau.length-1;k++) {
			System.out.print(FT3.tableau[k]);//devrait afficher 0,1,2,5,4,5,5,7,8,9
		}
	}
}


Il affiche :
tableau de FT:
012545578
tableau de FT2:
012345678
tableau de FT3:
012345678


Au lieu de
tableau de FT:
012545578
tableau de FT2:
012545578
tableau de FT3:
012345678

Je pense que le problème se situe dans mon mettreTableauAJour(), mais je ne vois pas où.
Je voudrais savoir si quelqu'un peut me donner des indices facile a comprendre pour un débutant.

Merci a tous

Configuration: Windows / Chrome 72.0.3626.109
A voir également:

1 réponse

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
16 févr. 2019 à 20:09
Bonjour,

Il n'y a pas de pointeurs en Java, on manipule des références d'objets.

Je ne suis pas trop sûr de comprendre le but de ton programme, mais tu peux faire comme ceci :

import java.util.Arrays;

public class FaireTableau {
    public int tableau[];

    public FaireTableau(int[] tab) {
        tableau = Arrays.copyOf(tab, tab.length);
    }

    public FaireTableau(FaireTableau FT) {
        this(FT.tableau);
    }

    public FaireTableau copie() {
        return this;
    }

    public void mettreTableauAJour(int index, int valeur_Mettre) {
        tableau[index] = valeur_Mettre;
    }
}

tableau de FT: 
012545578
tableau de FT2:
012545578
tableau de FT3:
012345678
0
JeryVG Messages postés 6 Date d'inscription mercredi 21 mars 2018 Statut Membre Dernière intervention 16 février 2019
16 févr. 2019 à 20:35
J'essayer de faire de petit exemple pour m’entraîner, et c'était un exemple ou j'arrivais pas a obtenir ce que je voulais. Je ne pense jamais à aller voir les mécaniques déjà faite dans la javadoc.
Merci de ton aide
0