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++

  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 ?

  8. #8
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    bool estHorsTerrain(Bloc bloc){
    	return !bloc.getActiver();
    }
    J'ai supposé que ta méthode getActiver() retournait un booléen qui indiquait si le bloc était dans le terrain. Donc ma fonction retourne un booléen qui inverse cette réponse. Elle m'indique si le bloc est hors du terrain donc à éliminer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::vector<Bloc>::iterator it = std::remove_if( blocs.begin(), blocs.end(), estHorsTerrain);
    Cette fonction fait partie de <algorithm>. Elle est chargée de retirer d'une collection tous les éléments pour lesquels le précat (estHorsTerrain) se vérifie.
    Les éléments ne sont pas supprimés physiquement de la collection mais ils sont poussés à la fin. La fonction retourne un itérateur sur le premier élément supprimé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    blocs.erase(it,blocs.end());
    Appel de la méthode qui élimine physiquement les éléments compris entre deux itérateurs.

  9. #9
    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
    std::vector<Bloc>::iterator it = std::remove_if( blocs.begin(), blocs.end(), estHorsTerrain);
    Est ce que je dois faire une boucle for pour que toute la liste soit traité ou ton instruction s'en occupe déja ?

    Sinon, en mettant tes deux instructions, cela me provoque une erreur de compilation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void GestionBlocs::verifierBlocs()
    {
        std::vector<Bloc>::iterator it = std::remove_if( blocs.begin(), blocs.end(), estHorsTerrain);
        blocs.erase(it,blocs.end());
     
    }
    rrazpo@rrazpo-desktop:~/Programme/tetris$ g++ -o tetris bloc.h gestionBlocs.h graphique.h jeu.h bloc.cpp gestionBlocs.cpp graphique.cpp jeu.cpp main.cpp -lsfml-graphics -lsfml-window -lsfml-system
    gestionBlocs.cpp: In member function ‘void GestionBlocs::verifierBlocs()’:
    gestionBlocs.cpp:38: error: argument of type ‘bool (GestionBlocs:(Bloc)’ does not match ‘bool (GestionBlocs::*)(Bloc)’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h: In function ‘_OutputIterator std::remove_copy_if(_InputIterator, _InputIterator, _OutputIterator, _Predicate) [with _InputIterator = __gnu_cxx::__normal_iterator<Bloc*, std::vector<Bloc, std::allocator<Bloc> > >, _OutputIterator = __gnu_cxx::__normal_iterator<Bloc*, std::vector<Bloc, std::allocator<Bloc> > >, _Predicate = bool (GestionBlocs::*)(Bloc)]’:
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:1291: instantiated from ‘_ForwardIterator std::remove_if(_ForwardIterator, _ForwardIterator, _Predicate) [with _ForwardIterator = __gnu_cxx::__normal_iterator<Bloc*, std::vector<Bloc, std::allocator<Bloc> > >, _Predicate = bool (GestionBlocs::*)(Bloc)]’
    gestionBlocs.cpp:38: instantiated from here
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:1216: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘__pred (...)’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h: In function ‘_RandomAccessIterator std::__find_if(_RandomAccessIterator, _RandomAccessIterator, _Predicate, std::random_access_iterator_tag) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Bloc*, std::vector<Bloc, std::allocator<Bloc> > >, _Predicate = bool (GestionBlocs::*)(Bloc)]’:
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:338: instantiated from ‘_InputIterator std::find_if(_InputIterator, _InputIterator, _Predicate) [with _InputIterator = __gnu_cxx::__normal_iterator<Bloc*, std::vector<Bloc, std::allocator<Bloc> > >, _Predicate = bool (GestionBlocs::*)(Bloc)]’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:1287: instantiated from ‘_ForwardIterator std::remove_if(_ForwardIterator, _ForwardIterator, _Predicate) [with _ForwardIterator = __gnu_cxx::__normal_iterator<Bloc*, std::vector<Bloc, std::allocator<Bloc> > >, _Predicate = bool (GestionBlocs::*)(Bloc)]’
    gestionBlocs.cpp:38: instantiated from here
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:260: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘__pred (...)’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:264: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘__pred (...)’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:268: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘__pred (...)’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:272: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘__pred (...)’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:280: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘__pred (...)’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:284: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘__pred (...)’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:288: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘__pred (...)’
    rrazpo@rrazpo-desktop:~/Programme/tetris$
    Que dois je faire ?

  10. #10
    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
    Il manque un & je dirais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<Bloc>::iterator it = std::remove_if( blocs.begin(), blocs.end(), &estHorsTerrain);
    MAT.

  11. #11
    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
    rrazpo@rrazpo-desktop:~/Programme/tetris$ g++ -o tetris bloc.h gestionBlocs.h graphique.h jeu.h bloc.cpp gestionBlocs.cpp graphique.cpp jeu.cpp main.cpp -lsfml-graphics -lsfml-window -lsfml-system
    gestionBlocs.cpp: In member function ‘void GestionBlocs::verifierBlocs()’:
    gestionBlocs.cpp:39: error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say ‘&GestionBlocs::estHorsTerrain’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h: In function ‘_OutputIterator std::remove_copy_if(_InputIterator, _InputIterator, _OutputIterator, _Predicate) [with _InputIterator = __gnu_cxx::__normal_iterator<Bloc*, std::vector<Bloc, std::allocator<Bloc> > >, _OutputIterator = __gnu_cxx::__normal_iterator<Bloc*, std::vector<Bloc, std::allocator<Bloc> > >, _Predicate = bool (GestionBlocs::*)(Bloc)]’:
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:1291: instantiated from ‘_ForwardIterator std::remove_if(_ForwardIterator, _ForwardIterator, _Predicate) [with _ForwardIterator = __gnu_cxx::__normal_iterator<Bloc*, std::vector<Bloc, std::allocator<Bloc> > >, _Predicate = bool (GestionBlocs::*)(Bloc)]’
    gestionBlocs.cpp:39: instantiated from here
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:1216: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘__pred (...)’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h: In function ‘_RandomAccessIterator std::__find_if(_RandomAccessIterator, _RandomAccessIterator, _Predicate, std::random_access_iterator_tag) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Bloc*, std::vector<Bloc, std::allocator<Bloc> > >, _Predicate = bool (GestionBlocs::*)(Bloc)]’:
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:338: instantiated from ‘_InputIterator std::find_if(_InputIterator, _InputIterator, _Predicate) [with _InputIterator = __gnu_cxx::__normal_iterator<Bloc*, std::vector<Bloc, std::allocator<Bloc> > >, _Predicate = bool (GestionBlocs::*)(Bloc)]’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:1287: instantiated from ‘_ForwardIterator std::remove_if(_ForwardIterator, _ForwardIterator, _Predicate) [with _ForwardIterator = __gnu_cxx::__normal_iterator<Bloc*, std::vector<Bloc, std::allocator<Bloc> > >, _Predicate = bool (GestionBlocs::*)(Bloc)]’
    gestionBlocs.cpp:39: instantiated from here
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:260: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘__pred (...)’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:264: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘__pred (...)’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:268: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘__pred (...)’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:272: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘__pred (...)’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:280: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘__pred (...)’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:284: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘__pred (...)’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:288: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘__pred (...)’
    rrazpo@rrazpo-desktop:~/Programme/tetris$
    Apparement il veut encore autre chose

  12. #12
    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
    Mets-la en tant que fonction libre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    namespace
    {
      bool estHorsTerrain( const Bloc& bloc )
      {
        ...
      }
    }
    MAT.

  13. #13
    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
    rrazpo@rrazpo-desktop:~/Programme/tetris$ g++ -o tetris bloc.h gestionBlocs.h graphique.h jeu.h bloc.cpp gestionBlocs.cpp graphique.cpp jeu.cpp main.cpp -lsfml-graphics -lsfml-window -lsfml-system
    gestionBlocs.cpp: In member function ‘void GestionBlocs::verifierBlocs()’:
    gestionBlocs.cpp:39: error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say ‘&GestionBlocs::estHorsTerrain’
    gestionBlocs.cpp: At global scope:
    gestionBlocs.cpp:46: error: definition of ‘bool GestionBlocs::estHorsTerrain(const Bloc&)’ is not in namespace enclosing ‘GestionBlocs’
    gestionBlocs.cpp:46: error: prototype for ‘bool GestionBlocs::estHorsTerrain(const Bloc&)’ does not match any in class ‘GestionBlocs’
    gestionBlocs.h:16: error: candidate is: bool GestionBlocs::estHorsTerrain(Bloc)
    gestionBlocs.cpp: In member function ‘bool GestionBlocs::estHorsTerrain(const Bloc&)’:
    gestionBlocs.cpp:48: error: passing ‘const Bloc’ as ‘this’ argument of ‘bool Bloc::getActiver()’ discards qualifiers
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h: In function ‘_OutputIterator std::remove_copy_if(_InputIterator, _InputIterator, _OutputIterator, _Predicate) [with _InputIterator = __gnu_cxx::__normal_iterator<Bloc*, std::vector<Bloc, std::allocator<Bloc> > >, _OutputIterator = __gnu_cxx::__normal_iterator<Bloc*, std::vector<Bloc, std::allocator<Bloc> > >, _Predicate = bool (GestionBlocs::*)(Bloc)]’:
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:1291: instantiated from ‘_ForwardIterator std::remove_if(_ForwardIterator, _ForwardIterator, _Predicate) [with _ForwardIterator = __gnu_cxx::__normal_iterator<Bloc*, std::vector<Bloc, std::allocator<Bloc> > >, _Predicate = bool (GestionBlocs::*)(Bloc)]’
    gestionBlocs.cpp:39: instantiated from here
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:1216: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘__pred (...)’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h: In function ‘_RandomAccessIterator std::__find_if(_RandomAccessIterator, _RandomAccessIterator, _Predicate, std::random_access_iterator_tag) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Bloc*, std::vector<Bloc, std::allocator<Bloc> > >, _Predicate = bool (GestionBlocs::*)(Bloc)]’:
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:338: instantiated from ‘_InputIterator std::find_if(_InputIterator, _InputIterator, _Predicate) [with _InputIterator = __gnu_cxx::__normal_iterator<Bloc*, std::vector<Bloc, std::allocator<Bloc> > >, _Predicate = bool (GestionBlocs::*)(Bloc)]’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:1287: instantiated from ‘_ForwardIterator std::remove_if(_ForwardIterator, _ForwardIterator, _Predicate) [with _ForwardIterator = __gnu_cxx::__normal_iterator<Bloc*, std::vector<Bloc, std::allocator<Bloc> > >, _Predicate = bool (GestionBlocs::*)(Bloc)]’
    gestionBlocs.cpp:39: instantiated from here
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:260: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘__pred (...)’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:264: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘__pred (...)’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:268: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘__pred (...)’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:272: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘__pred (...)’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:280: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘__pred (...)’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:284: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘__pred (...)’
    /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_algo.h:288: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘__pred (...)’
    Cela ne change rien.

    Et cela sert a quoi de mettre une fonction "fonction libre" ?

  14. #14
    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
    Tu n'es pas obligé de la mettre en fonction libre, tu peux aussi mettre la méthode statique mais ça encombre le .h inutilement, certains préfèrent cela dit.

    Sinon il faut que la fonction libre soit définie avant l'appel.
    Si ce n'est toujours pas ça, il faudrait que tu montres un peu plus de code pour voir précisément...

    MAT.

  15. #15
    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
    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
     
    #include <iostream>
    #include <vector>
    #include <algorithm>
     
    #include "gestionBlocs.h"
    #include "bloc.h"
     
    using namespace std;
     
    GestionBlocs::GestionBlocs()
    {
      for(int i=0;i<12;i++)
        {
          for(int j=0;i<24;i++)
    	{
    	  cases[i][j]=false;
    	}
        }
    }
     
    void GestionBlocs::ajouterBloc()
    {
      Bloc bloc;
      blocs.push_back(bloc); //rajoute un bloc a la fin du tableau
    }
     
     
     
    bool GestionBlocs::testMobile()
    {
     
     
     
    }
     
    void GestionBlocs::verifierBlocs()
    {
        std::vector<Bloc>::iterator it = std::remove_if( blocs.begin(), blocs.end(), &estHorsTerrain);
        blocs.erase(it,blocs.end());
     
    }
     
    namespace
    {
    bool GestionBlocs::estHorsTerrain(const Bloc &bloc)
    {
        return !bloc.getActiver(); //retourne false si le bloc est dans le terrain et true si il ne l'est pas
    }
    }
    Sinon il faut que la fonction libre soit définie avant l'appel.
    Je n'ai pas bien compris cette phrase, je dois le définir dans le .h ? (si oui, comment ?)

  16. #16
    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
    Non dans le cpp, mais avant son utilisation, et il ne faut pas mettre de GestionBlocs:: puisque ce n'est plus une méthode mais une fonction libre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    namespace
    {
    bool estHorsTerrain(const Bloc &bloc)
    {
        return !bloc.getActiver(); //retourne false si le bloc est dans le terrain et true si il ne l'est pas
    }
    }
     
    void GestionBlocs::verifierBlocs()
    {
        std::vector<Bloc>::iterator it = std::remove_if( blocs.begin(), blocs.end(), &estHorsTerrain);
        blocs.erase(it,blocs.end());
     
    }
    (et il ne faut pas du tout déclarer de estHorsTerrain dans le .h )

    MAT.

  17. #17
    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
    rrazpo@rrazpo-desktop:~/Programme/tetris$ g++ -o tetris bloc.h gestionBlocs.h graphique.h jeu.h bloc.cpp gestionBlocs.cpp graphique.cpp jeu.cpp main.cpp -lsfml-graphics -lsfml-window -lsfml-system gestionBlocs.cpp: In function ‘bool<unnamed>::estHorsTerrain(const Bloc&)’:
    gestionBlocs.cpp:41: error: passing ‘const Bloc’ as ‘this’ argument of ‘bool Bloc::getActiver()’ discards qualifiers
    rrazpo@rrazpo-desktop:~/Programme/tetris$
    C'est déja beaucoups mieu

    Sinon, je n'ai pas très bien compris pourquoi il faut passer cette fonction en fonction libre (si c'est trop long a expliquer un lien me suffirait ).

    Merci déja de ton aide !

  18. #18
    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
    Citation Envoyé par lapos Voir le message
    Sinon, je n'ai pas très bien compris pourquoi il faut passer cette fonction en fonction libre (si c'est trop long a expliquer un lien me suffirait ).
    Voilà : http://www.parashift.com/c++-faq-lit....html#faq-33.1

    Sinon il faut que tu mettes la méthode Bloc::getActiver() const pour corriger ce dernier problème.
    Ou si vraiment tu ne veux pas tu peux aussi passer soit un Bloc& soit un Bloc par copie comme c'était le cas avant...

    MAT.

  19. #19
    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 beaucoups !

    Problème résolus

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

Discussions similaires

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

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