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 :

Remplir un echiquier a partir d'un fichier .txt


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Par défaut Remplir un echiquier a partir d'un fichier .txt
    Bonjour a tous,

    Il m'est demande de programmer un objet Echiquier qui contient une fonction charger(), censee lire un fichier .txt de 8 lignes de 8 caracteres.

    En fonction des caracteres, je remplis mon objet Echiquier avec des Pieces. L'Echiquier contient un attribut qui est un vecteur de Pieces, Pieces etant un objet abstrait avec comme filles concretes Pion, Roi et Cavalier.

    Voici la fonction charger que j'ai faite:

    Echiquier.cxx
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    void Echiquier::charger (std::string nomfichier)
    {
    	std::ifstream fichier (nomfichier.c_str()); //Fallait le savoir!!!
     
    	if (fichier)
    	{
    		std::string contenu;
    		int num_ligne = 0;
    		int num_colonne = 0;
    		while (std::getline(fichier,contenu))
    		{
    			std::string::iterator it;
    			num_colonne=0;
    			for (it=contenu.begin(); it!=contenu.end(); it++)
    			{
    				std::cout<<"num_ligne="<<num_ligne<<", num_colonne="<<num_colonne<<" et *it="<<(*it)<<std::endl;
    				if ((*it)=='.')
    				{
     
    				}
    				if ((*it)=='p')
    				{
    					static Pion pi = *(new Pion("blanc",*(new Position(num_ligne,num_colonne))));
    					static Piece* p = &pi;
    					ajouter(p);
    				}
    				if ((*it)=='c')
    				{
    					static Cavalier pi = *(new Cavalier("blanc",*(new Position(num_ligne,num_colonne))));
    					static Piece* p = &pi;
    					ajouter(p);
    				}
    				if ((*it)=='r')
    				{
    					static Roi pi = *(new Roi("blanc",*(new Position(num_ligne,num_colonne))));
    					static Piece* p = &pi;
    					ajouter(p);
    				}
    				if ((*it)=='P')
    				{
    					static Pion pi = *(new Pion("noir",*(new Position(num_ligne,num_colonne))));
    					static Piece* p = &pi;
    					ajouter(p);
    				}
    				if ((*it)=='C')
    				{
    					static Cavalier pi = *(new Cavalier("noir",*(new Position(num_ligne,num_colonne))));
    					static Piece* p = &pi;
    					ajouter(p);
    				}
    				if ((*it)=='R')
    				{
    					static Roi pi = *(new Roi("noir",*(new Position(num_ligne,num_colonne))));
    					static Piece* p = &pi;
    					ajouter(p);
    				}
    				num_colonne++;
    			}
    			num_ligne++;
    		}
    		fichier.close();
    	}
    	else
    	{
    		std::cout<<"Impossible d'ouvrir le fichier"<<std::endl;
    	}
    }
    Probleme: Evidemment, des que la fonction se termine, les Pieces disparaissent donc mon echiquier est vide...

    Le rajout du mot static m'a permis de voir que c'est bien ca le probleme, mais comme vous pouvez vous en douter, ca ne resout pas le probleme. Je crois qu'il faille que je declare un vecteur<Piece*> comme variable globale, mais je ne sais pas ou le mettre et comment le faire.

    Si quelqu'un a une idee, merci d'avance.

  2. #2
    Membre éprouvé Avatar de Xtrem_Voyageur
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2009
    Messages : 85
    Par défaut
    Tu as un affichage graphique à côté de ton échiquier?
    Sinon, en effet, il me parait raisonnable que les pièces soient des attributs de ta classe Echiquier, tu ne devrais pas avoir à les créer dans la méthode charger. Elles devraient l'être en même temps que la création d'une instance de ta classe.

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Par défaut
    Non. L'exercice impose que le constructeur de l'échiquier crée un échiquier vide. Son vecteur de pièce est donc initialisé, mais vide, après la construction de l'échiquier.

    Par contre, les pièces sont des structures à part, et me servent à remplir l'échiquier dans le main en utilisant des pointeurs du type

    Où PionBlanc est un objet "Pion", une classe fille de Piece (Piece est abstraite).

    La méthode charger, quant à elle, doit servir à remplir l'échiquier de pièces en fonction du contenu du fichier.

    Sauf que je n'arrive pas à créer de pièces dedans de façon qu'elles survivent à la fin de la fonction (mon échiquier est bien rempli dans charger, mais se vide quand elle se termine, ce qui est logique puisque les pointeurs sont "flingués").

    Remède?

  4. #4
    Membre éprouvé Avatar de Xtrem_Voyageur
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2009
    Messages : 85
    Par défaut
    D'ailleurs pourquoi nommer tes pièces dans ta méthode charger?
    Tu peux faire directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ajouter(new Pion(...)), ajouter(new Cavalier(...))
    Quoiqu'il en soit, c'est créé sur le tas donc tant que ta mémoire n'est pas désallouée explicitement, elles seront en mémoire, il faut juste veiller à ne pas "perdre" les pointeurs sur ces zones mémoire, donc ici c'est à ta méthode ajouter de faire le nécessaire.

    Car toi, tu fais quelque chose d'étrange, tu crées tes objets Pion, Cavalier et tu utilises une affectation pour qu'ils aient la valeur que tu souhaites leur donner à partir du contenu du même objet crée dynamiquement... tes variables sont donc des variables automatiques locales à ta méthode et sont détruites à la fin de la méthode. A AUCUN MOMENT TU N'AS CONSERVE UN POINTEUR EN MEMOIRE en faisant Pion p = *(new Pion(...)), je pense que c'est la que tu pêches. Tu réalises une copie d'un objet créé dynamiquement avec le new (dont tu n'as gardé aucune référence) et cet objet est copié dans la variable locale p que tu crées. Attention donc à ca.
    A la limite, fais Piece* p = new Pion(..);

Discussions similaires

  1. Réponses: 5
    Dernier message: 29/06/2009, 11h57
  2. Remplir une liste dynamiquement à partir d'un fichier PHP
    Par titoff85 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 13/08/2007, 20h57
  3. Réponses: 2
    Dernier message: 02/03/2007, 14h04
  4. remplir une table a partir d'un fichier
    Par Poulain dans le forum ASP.NET
    Réponses: 1
    Dernier message: 23/02/2007, 20h12
  5. Comment remplir un bean a partir d'un fichier xml
    Par NewSer dans le forum Persistance des données
    Réponses: 2
    Dernier message: 02/02/2007, 13h19

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