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 en attribut.


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 75
    Par défaut Tableau dynamique en attribut.
    Bonjour a tous

    Voilà, je suis en train de m'exercer en C++, et j'ai comme ambition de créer un petit tetris.

    Pour le moment ça se déroule a peu près correctement, mais là je tombe sur un problème.

    Ma classe GestionBlocs doit (comme son nom l'indique) gérer tout les blocs du jeu, le truc c'est que je ne sais pas trop comment faire pour stocker tout ces blocs dans ma classe.

    Je ne peut pas faire un tableau dès le départ, parceque je ne sais pas a l'avance combien ma classe va t'elle devoir gérer de bloc.

    On en vient donc a ma question, peut on crée un tableau dynamique comme attribut et si oui, comment peut on modifier sa taille pendant que mon programme est en cours d'execution ?

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Tu peux par exemple jeter un oeil dans la FAQ à l'entrée Comment créer et utiliser un tableau avec std::vector.

    MAT.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 75
    Par défaut
    Merci pour ton lien, c'est très utile !

    Je rencontre juste un petit problème, je n'ai pas compris comment effacer un élément de la liste.

    (en même temps si vous pouviez me dire si mon code est juste ce serais sympa )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void GestionBlocs::ajouterBloc()
    {
      Bloc bloc;
      nbBlocs++;
      blocs.resize(nbBlocs); //réajuste le tableau en fonction du nombre de bloc
      blocs.push_back(bloc); //rajoute un bloc a la fin du tableau
    }
    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
    void GestionBlocs::verifierBlocs() //vérifie que dans le tableau tout les blocs sont dans le terrains, et si ils n'y sont plus, suppresion du bloc
    {
      bool variable=true;
      bool test=false;
      do
        {
          test=false;
          int b;
          for( size_t i, size = blocs.size(); i< size; i++ ) //parcours tout mon tableau
    	{
    	  variable=blocs[i].getActiver();
    	  if(variable==false) //si les blocs ne sont pas sur le terrain;
    	    {
    	      test=true;
    	      b=i; //b est une variable servant a savoir quel element du tableau effacer
    	    }
    	}
     
          if(test==true) 
    	{
    	  nbBlocs--; //on supprime  un bloc
    	  blocs.erase(b); //ici ça plante
    	}
        }while(test==true); //tant que tout les elements du tableau inutile ne sont pas effacer
    }

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    En fait juste à côté de l'entrée précédente dans la FAQ il y en a une autre intitulée Comment supprimer correctement des éléments d'un conteneur qui explique justement ça.

    Sinon ton appel à resize est inutile, c'est fait automatiquement quand tu fais le push_back si c'est nécessaire.

    MAT.

  5. #5
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    Ta boucle for est bizarre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for( size_t i, size = blocs.size(); i< size; i++ ) //parcours tout mon tableau
    	}
    Tu n'initialises pas i, donc ça risque de planter. Fait comme ça :

    for (std::size_t i = 0 ; i != < blocs.size() ; ++i).

    Ou sinon avec des itérateurs :

    for (std::vector<Bloc>::iterator it = blocs.begin(); it != blocs.end() ; ++it)

    ou un itérateur constant dans ton cas vu que tu ne modifies pas tes objets contenus dans ton vector (tu remplaces iterator par const_iterator).

  6. #6
    Membre éclairé Avatar de gelam
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2003
    Messages : 69
    Par défaut
    Regarde du côtés des algorithmes et ça simplifie ton code...
    Dans ton cas on écrit une fonction qui indique si le bloc est dans le terrain
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    bool estHorsTerrain(Bloc bloc){
    	return !bloc.getActiver();
    }
    Puis on utilise remove_if pour retirer les blocs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // Les éléments à éliminer sont mis à la fin
    // it pointe sur le premier à retirer
    std::vector<Bloc>::iterator it = std::remove_if( blocs.begin(), blocs.end(), estHorsTerrain);
    // On efface phisiquement
    blocs.erase(it,blocs.end());

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 75
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    bool estHorsTerrain(Bloc bloc){
    	return !bloc.getActiver();
    }
    Je ne comprend pas a quoi sert cette fonction et surtout ce qu'elle fait

    Car là, naivement je dirait qu'elle renvoie toujours false, mais bon je me doute que ce n'est pas ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<Bloc>::iterator it = std::remove_if( blocs.begin(), blocs.end(), estHorsTerrain);
    Pourrait tu me commenter a quoi sert cette ligne ? (je débute, et je n'ai encore jamais utilisé la classe vector)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    blocs.erase(it,blocs.end());
    A quoi cela sert il de donner l'itérateur vu qu'on dis que l'objet a effacer est le dernier de la liste ?

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/03/2015, 18h31
  2. récupérer la memoire et tableau dynamique
    Par Guigui_ dans le forum Langage
    Réponses: 6
    Dernier message: 06/01/2003, 08h02
  3. AFFICHER UN TABLEAU DYNAMIQUE
    Par ghassenus dans le forum Langage
    Réponses: 2
    Dernier message: 28/12/2002, 14h19
  4. [Kylix] tableau dynamique
    Par sdoura2 dans le forum EDI
    Réponses: 1
    Dernier message: 31/10/2002, 08h57
  5. Réponses: 4
    Dernier message: 13/05/2002, 16h43

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