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

C++ Discussion :

Tableau dynamique pointeur


Sujet :

C++

  1. #1
    Membre du Club
    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 : 51
    Points
    51
    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é
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    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 du Club
    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 : 51
    Points
    51
    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
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    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.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Bousk est un peu dur dans ses propos mais je le soutiens sur le fond.
    Find me on github

  6. #6
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    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;
       }
    }
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  7. #7
    Membre du Club
    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 : 51
    Points
    51
    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