Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    février 2011
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : février 2011
    Messages : 61
    Points : 17
    Points
    17

    Par défaut Tableau dynamique pointeur

    Bonjour,
    Je dispose de 2 classes:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    #pragma once
    class Etat
    {
    private:
    	bool occupe;
    	int direction;
    public:
    	Etat();
    	Etat(bool o, int d);
    	bool get_o();
    	int get_d();
    	void set_o(bool o);
    	void set_d(int d);
    	void modif_d();
    	~Etat(void);
    };
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    #include "Etat.h"
    #pragma once
     
    class Plateau
    {
    private:
    	Etat** tab;
    	int hauteur, largeur;
    public:
    	Plateau();
    	Plateau(int h, int l);
    	void affiche();
    	//Etat& get_case(int i, int j);
    	int get_h();
    	int get_l();
    	~Plateau(void);
    };
    « tab » est un tableau à deux dimensions. Chacune de ses cases est du type de la classe « Etat ». Chacune des cases dois être initialisée à « false » et 1.
    Le probleme est que je n'arrive pas a associer un pointeur sur chaque case.

    Mon code (Constructeur de la classe Plateau):
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Plateau::Plateau() //ininitalise les valeurs par defauts
    {
    	this->hauteur = 9;
    	this->largeur = 15;
    	//this->tab = new Etat* [this->largeur, this->hauteur];
    	Etat** tab = new Etat* [this->hauteur];
    	for(int i=1; i<=this->largeur; i++){
    		for(int j=1; j<=this->hauteur; j++){
    		Etat *cB = new Etat();
    		this->tab[i][j] = *cB;
    		}
    	}
    }

  2. #2
    Membre confirmé
    Profil pro Romain LEGUAY
    Inscrit en
    avril 2010
    Messages
    306
    Détails du profil
    Informations personnelles :
    Nom : Romain LEGUAY

    Informations forums :
    Inscription : avril 2010
    Messages : 306
    Points : 208
    Points
    208

    Par défaut

    Salut,

    Je pense que tu as oublié d'allouer la mémoire pour la largeur de ton tableau tab.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    Plateau::Plateau() //ininitalise les valeurs par defauts
    {
    	this->hauteur = 9;
    	this->largeur = 15;
    	this->tab = new Etat* [this->largeur];
    	for(int i=1; i<=this->largeur; i++){
     
                    this->tab[i] = new Etat[this->hauteur];
     
    		for(int j=1; j<=this->hauteur; j++){
    		   Etat *cB = new Etat();
    		   this->tab[i][j] = *cB;
    		}
    	}
    }

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    février 2011
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : février 2011
    Messages : 61
    Points : 17
    Points
    17

    Par défaut

    Merci de ta réponse rapide,
    Cependant j'ai encore une difficulté au niveau de la récuperation des pointeurs.
    J'ai une autre fonction afficher() ou je dois afficher mon tableau en fonction de la valeur du pointeur de chaque case. mon probleme est que je n'arrive pas a accéder au pointeurs.

    Ma fonction:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void Plateau::affiche()
    {
    	for(int i=1; i<=this->largeur; i++){
    		for(int j=1; j<=this->hauteur; j++){
    		   Etat *cB = new Etat();
    		   *cB = this->tab[i][j];
    		  // cout << "Valeurs du pointeur" << *cB << " " <<  endl;
    		}
    	}
    }
    Je ne suis pas sur que ma méthode sois la bonne.

  4. #4
    Modérateur

    Homme Profil pro Cyrille
    Network programmer
    Inscrit en
    juin 2010
    Messages
    2 042
    Détails du profil
    Informations personnelles :
    Nom : Homme Cyrille
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Network programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 2 042
    Points : 4 820
    Points
    4 820

    Par défaut

    Bonjour,

    que tous ces codes sont moches !

    Pourquoi crois-tu devoir te faire chier avec un tableau de pointeur alors que tu as en fait un tableau d'objets ?
    Pourquoi faire une allocation dynamique pour finalement insérer dans le tableau une copie de l'élément alloué ?!?!

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    this->hauteur = 9;
    	this->largeur = 15;
    	this->tab = new Etat* [this->largeur];
    	for(int i=1; i<=this->largeur; i++){
     
                    this->tab[i] = new Etat[this->hauteur];
     
    		for(int j=1; j<=this->hauteur; j++){
    		   Etat *cB = new Etat();
    		   this->tab[i][j] = *cB;
    		}
    	}
    La partie en gras est une hérésie et ce code entraîne de toutes façons juste un bon gros crash de ton application.
    Il faut sérieusement revoir les bases du langages, un tableau a des index 0-based et pour nb éléments on peut accéder aux éléments 0 à nb-1 inclus (soit nb exclus)

    Code :
    1
    2
    3
    4
    5
    6
    hauteur = 9;
    	largeur = 15;
    	tab = new Etat* [hauteur];
    	for(int i=0; i < hauteur; ++i)
    		tab[i] = new Etat[largeur];
    	}
    Et tu n'as besoin de strictement rien d'autre. Ton tableau d'état est alloué, les opérateurs new font automatiquement appel aux constructeurs.

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void Plateau::affiche()
    {
    	for(int i=1; i<=this->largeur; i++){
    		for(int j=1; j<=this->hauteur; j++){
    		   Etat *cB = new Etat();
    		   *cB = this->tab[i][j];
    		  // cout << "Valeurs du pointeur" << *cB << " " <<  endl;
    		}
    	}
    }
    Ce code est encore pire !
    Tu alloues un pointeur pour finalement qu'il prenne la valeur d'un élément du tableau. Eléments de tableau qui sont des objets et pas du tout des pointeurs ! Et donc ça ne doit même pas compiler... une idée de piste de code faux que ton compilateur t'indique lui-même.


    Les pertes mémoires sont énormes, le langage n'est pas du tout connu à la base et la manipulation des pointeur n'est pas aisée, surtout quand on ne sait pas ce qu'est un pointeur.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void Plateau::affiche()
    {
    	for(int i=0; i < largeur; i++){
    		for(int j=0; j < hauteur; j++){
    		   Etat &cB = tab[i][j];
    		   // maintenant tu fais ce que tu veux de ton cB qui est l'élément du tableau correspondant à (i,j)
    		}
    	}
    }
    Au passage, répéter this est inutile, et lis sérieusement un cours de C++ qui explique la manipulation de tableaux, l'allocation dynamique, les pointeurs et références.
    Mieux encore : utiliser enfin std::vector.

  5. #5
    Membre Expert
    Profil pro Jean-Bernard
    Inscrit en
    mars 2007
    Messages
    1 234
    Détails du profil
    Informations personnelles :
    Nom : Jean-Bernard
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : mars 2007
    Messages : 1 234
    Points : 2 109
    Points
    2 109

    Par défaut

    Bousk est un peu dur dans ses propos mais je le soutiens sur le fond.

  6. #6
    r0d
    r0d est actuellement connecté
    Expert Confirmé Sénior

    Profil pro
    Inscrit en
    août 2004
    Messages
    4 069
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : août 2004
    Messages : 4 069
    Points : 5 079
    Points
    5 079

    Par défaut

    +1. C'est un peu brusque sur la forme mais le fond est juste.

    Pour résumer, et pour faire simple:
    Code :
    vector<Etat> tab(largeur*hauteur);
    Et hop, en une ligne, ton tableau est déclaré et alloué; et sur la pile en plus (tu n'auras donc même pas à t'occuper de la libération; à condition que le destructeur de la classe Etat soit correct).

    Quant à l'affichage:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    void Plateau::affiche()
    {
       for(int i=0; i<largeur; ++i){
    	for(int j=0; j<hauteur; ++j)
    	   cout << tab[j+i*largeur] << " ";
    	cout << endl;
       }
    }

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    février 2011
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : février 2011
    Messages : 61
    Points : 17
    Points
    17

    Par défaut

    Je vous remercie pour vos réponses, elles m'ont bien aidées.
    Cependant Bousk n'oublie que toi aussi un jour tu as débuté.

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •