p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    février 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : février 2011
    Messages : 65
    Points : 20
    Points
    20

    Par défaut Tableau dynamique pointeur

    Bonjour,
    Je dispose de 2 classes:
    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
     
    #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 : 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
     
    #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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 éclairé
    Ingénieur développement logiciels
    Inscrit en
    avril 2010
    Messages
    380
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : avril 2010
    Messages : 380
    Points : 333
    Points
    333

    Par défaut

    Salut,

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

    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
     
    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
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    février 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : février 2011
    Messages : 65
    Points : 20
    Points
    20

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Network programmer
    Inscrit en
    juin 2010
    Messages
    2 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Network programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 2 689
    Points : 7 704
    Points
    7 704

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Expert Confirmé
    Profil pro
    Inscrit en
    mars 2007
    Messages
    1 342
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : mars 2007
    Messages : 1 342
    Points : 2 687
    Points
    2 687

    Par défaut

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

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

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

    Informations forums :
    Inscription : août 2004
    Messages : 4 196
    Points : 5 982
    Points
    5 982

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    février 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : février 2011
    Messages : 65
    Points : 20
    Points
    20

    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.

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/12/2007, 19h51
  2. Allocation dynamique: Tableau de pointeur sur char
    Par Anonymouse dans le forum Débuter
    Réponses: 4
    Dernier message: 21/10/2007, 10h57
  3. allocation dynamique d'un tableau de pointeurs
    Par Dilettante dans le forum C++
    Réponses: 9
    Dernier message: 29/06/2007, 23h41
  4. Réponses: 67
    Dernier message: 13/02/2007, 18h08
  5. Réponses: 13
    Dernier message: 01/10/2006, 00h25

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