Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Help iterator  (Lu 5528 fois)

0 Membres et 8 Invités sur ce sujet

Bombseb

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Help iterator
« le: Septembre 28, 2013, 11:39:32 pm »
Bonjour,

J'ai un petit problème dans un prog que j'éssaye de faire, je débute en C++ et SFML donc désolé par avance si c'est une question de noob.

Voici mon code (épuré)

le .h :

class Mec
{
    public:
        Mec(float const& x, float const& y);

    private:
        sf::Sprite currentSprite;

        std::vector<sf::Sprite> idle_Right;
        std::vector<sf::Sprite>::iterator itSprite;
};



le .cpp :

Mec::Mec(float const& x, float const& y)
{
   itSprite = idle_Right.begin();
   *itSprite->setPosition (sf::Vector2f (x,y));
}

A la compilation il râle sur le setPosition :
Citer
void value not ignored as ought to be

Pourtant *itSprite est bien du type sf::Sprite non ?

Est-ce que quelqu'un a une idée svp ?

Merci d'avance

Bombseb

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : Help iterator
« Réponse #1 le: Septembre 29, 2013, 12:24:39 am »
Bon j'ai trouvé, il fallais mettre ca :

Citer
(*itSprite).setPosition (sf::Vector2f (x,y));

Je ne comprend pas trop pourquoi....

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Help iterator
« Réponse #2 le: Septembre 29, 2013, 09:14:05 am »
Parce que -> est prioritaire sur *. Donc ta première version était en fait :

*(itSprite->setPosition (sf::Vector2f (x,y)))

Sinon, tu peux aussi tout simplement écrire

itSprite->setPosition (sf::Vector2f (x,y))

Un itérateur a la même sémantique qu'un pointeur.
Laurent Gomila - SFML developer

Bombseb

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : Help iterator
« Réponse #3 le: Septembre 29, 2013, 09:30:28 am »
Salut et merci pour ta réponse,

Effectivement ta solution marche aussi...
Du coup je ne comprend plus trop, je vais m'informer un peu plus sur les iterateurs...

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Help iterator
« Réponse #4 le: Septembre 29, 2013, 09:31:50 am »
Qu'est-ce que tu ne comprends pas ?
Laurent Gomila - SFML developer

Bombseb

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : Help iterator
« Réponse #5 le: Septembre 29, 2013, 10:06:15 am »
Nonnon c'est bon

Je viens de faire quelques tests sur l'iterator....c'est bon j'ai compris, on le manipule comme un pointeur
Je ne suis pas encore hype familier avec tout ca mais ca va venir, merci pour ton aide en tout cas  ;D

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Help iterator
« Réponse #6 le: Septembre 29, 2013, 12:56:27 pm »
N'hésite pas à bien bosser tes bases de C++ avant d'essayer de faire des trucs compliqués. On voit trop de débutants qui foncent tête baissée dans l'élaboration d'un jeu avec SFML sans même connaître le C++, et... ils arrivent droit dans le mur ;)
Laurent Gomila - SFML developer

Bombseb

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : Help iterator
« Réponse #7 le: Octobre 05, 2013, 08:53:51 pm »
Bon alors j'ai encore un problème avec mon iterator  :-[

Dans ma classe j'ai ces variables :

sf::Sprite *currentSprite;
std::vector<sf::Sprite> walk_Up;
std::vector<sf::Sprite>::iterator itSprite;

Et dans mon .cpp à un moment je fait ca :
itSprite = walk_Up.begin();
currentSprite = itSprite;

Et à la compil sur l'affectation de currentsprite il me dis ca :

/home/seb/Progs/SFML/2DISO/2DISO-build-desktop-Qt_4_8_1_dans_le_PATH__Syst_me__Release/../2DISO/mec.cpp:112: erreur : cannot convert 'std::vector<sf::Sprite>::iterator* {aka __gnu_cxx::__normal_iterator<sf::Sprite*, std::vector<sf::Sprite> >*}' to 'sf::Sprite*' in assignment
Pourtant je ne comprend pas, currentSprite est bien un pointeur vers un sf::Sprite et mon iterator est sensé être un pinteur vers un sf:sprite aussi... non ?





Bombseb

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : Help iterator
« Réponse #8 le: Octobre 05, 2013, 08:55:17 pm »
Je remarque que si je fait ca :

currentSprite = &(*itSprite);
Ca marche.... bizarre


Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Help iterator
« Réponse #9 le: Octobre 06, 2013, 08:44:49 am »
Un itérateur se comporte comme un pointeur, mais ce n'en est pas un. Pointeur et itérateurs sont deux types qui n'ont rien à voir, et il faut déréférencer comme tu le fais pour retrouver l'adresse de l'objet pointé par l'itérateur.
Laurent Gomila - SFML developer

Bombseb

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : Help iterator
« Réponse #10 le: Octobre 06, 2013, 08:53:24 pm »
ok...

Bizarre quand même mais bon
Du coup j'ai préféré utiliser un simple compteur plutôt qu'un iterator au moins c'est plus simple

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Help iterator
« Réponse #11 le: Octobre 06, 2013, 09:31:23 pm »
C'est pas bizarre, ni compliqué. Au contraire, les itérateurs font tout pour que leur utilisation soit naturelle et proche des pointeurs, pour te faciliter la vie. Mais ce n'en sont pas (leur fonctionnement peut être plus complexe selon le type de conteneur), donc il faut une petite conversion pour avoir l'objet pointé puis son adresse. C'est tout.

Mais pourquoi est-ce que tu as besoin de stocker un itérateur ? Normalement tu ne les utilises que localement, pour itérer sur un conteneur ou trouver un élement.
Laurent Gomila - SFML developer

Bombseb

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : Help iterator
« Réponse #12 le: Octobre 07, 2013, 07:49:39 am »
C'était pour gérer l'animation d'un sprite en quatre étapes.
Je stocke mes quatre sprites dans un vector, et à chaque affichage j'incrément mon iterator pour passer au sprite suivant

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Help iterator
« Réponse #13 le: Octobre 07, 2013, 07:52:59 am »
Là tu peux utiliser un indice, en plus le bouclage sera plus facile (tu as juste à faire un modulo).
Laurent Gomila - SFML developer

Bombseb

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
Re : Help iterator
« Réponse #14 le: Octobre 07, 2013, 06:14:06 pm »
Yep, c'est exactement ce que j'ai fait sauf que j'ai utilisé un and pour boucler en faisant ca :

        nAnimFrame++;
        nAnimFrame = nAnimFrame & 3;