Précédent   Forum du club des développeurs et IT Pro > C et C++ > C++
C++ Forum d'entraide technique sur le langage C++. Avant de poster -> F.A.Q C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 04/01/2013, 16h36   #1
Alex63530
Candidat au titre de Membre du Club
 
Homme
Inscription : février 2011
Messages : 45
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : février 2011
Messages : 45
Points : 13
Points : 13
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;
		}
	}
}
Alex63530 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 17h05   #2
darkman19320
Membre habitué
 
Romain LEGUAY
Inscription : avril 2010
Messages : 227
Détails du profil
Informations personnelles :
Nom : Romain LEGUAY

Informations forums :
Inscription : avril 2010
Messages : 227
Points : 137
Points : 137
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;
		}
	}
}
darkman19320 est déconnecté   Envoyer un message privé Réponse avec citation 12
Vieux 05/01/2013, 17h13   #3
Alex63530
Candidat au titre de Membre du Club
 
Homme
Inscription : février 2011
Messages : 45
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : février 2011
Messages : 45
Points : 13
Points : 13
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.
Alex63530 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2013, 17h41   #4
Bousk
Modérateur
 
Homme Cyrille
Network programmer
Inscription : juin 2010
Messages : 1 535
Détails du profil
Informations personnelles :
Nom : Homme Cyrille
Âge : 25
Localisation : France

Informations professionnelles :
Activité : Network programmer

Informations forums :
Inscription : juin 2010
Messages : 1 535
Points : 4 059
Points : 4 059
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.
Bousk est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 07/01/2013, 14h46   #5
jblecanard
Membre Expert
 
Jean-Bernard
Inscription : mars 2007
Messages : 1 001
Détails du profil
Informations personnelles :
Nom : Jean-Bernard
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mars 2007
Messages : 1 001
Points : 1 628
Points : 1 628
Bousk est un peu dur dans ses propos mais je le soutiens sur le fond.
jblecanard est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2013, 15h59   #6
r0d
Expert Confirmé Sénior
 
Inscription : août 2004
Messages : 3 665
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : août 2004
Messages : 3 665
Points : 4 420
Points : 4 420
+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;
   }
}
r0d est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/01/2013, 16h30   #7
Alex63530
Candidat au titre de Membre du Club
 
Homme
Inscription : février 2011
Messages : 45
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : février 2011
Messages : 45
Points : 13
Points : 13
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é.
Alex63530 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 10h13.


 
 
 
 
Partenaires

Hébergement Web