Forum de la communauté SFML

Aide => Général => Discussion démarrée par: Bombseb le Septembre 28, 2013, 11:39:32 pm

Titre: Help iterator
Posté par: Bombseb 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
Titre: Re : Help iterator
Posté par: Bombseb 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....
Titre: Re : Help iterator
Posté par: Laurent 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.
Titre: Re : Help iterator
Posté par: Bombseb 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...
Titre: Re : Help iterator
Posté par: Laurent le Septembre 29, 2013, 09:31:50 am
Qu'est-ce que tu ne comprends pas ?
Titre: Re : Help iterator
Posté par: Bombseb 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
Titre: Re : Help iterator
Posté par: Laurent 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 ;)
Titre: Re : Help iterator
Posté par: Bombseb 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 ?




Titre: Re : Help iterator
Posté par: Bombseb le Octobre 05, 2013, 08:55:17 pm
Je remarque que si je fait ca :

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

Titre: Re : Help iterator
Posté par: Laurent 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.
Titre: Re : Help iterator
Posté par: Bombseb 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
Titre: Re : Help iterator
Posté par: Laurent 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.
Titre: Re : Help iterator
Posté par: Bombseb 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
Titre: Re : Help iterator
Posté par: Laurent 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).
Titre: Re : Help iterator
Posté par: Bombseb 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;
Titre: Re : Help iterator
Posté par: Laurent le Octobre 07, 2013, 07:43:15 pm
Ca sert à quoi, à part être moins lisible et maintenable ?
Titre: Re : Help iterator
Posté par: Bombseb le Octobre 07, 2013, 08:11:03 pm
Plus pratique ?
Ca tiens en une ligne, pas besoin de faire un if

Titre: Re : Help iterator
Posté par: Laurent le Octobre 07, 2013, 08:37:51 pm
nAnimFrame = (nAnimFrame + 1) % FrameCount;

Ensuite, même s'il avait fallu plus de lignes et un if, peu importe. La lisibilité et la maintenabilité sont plus importantes que le nombre de lignes. Tu ne fais pas un concours du code le plus compact ;)
Titre: Re : Help iterator
Posté par: Bombseb le Octobre 08, 2013, 06:20:37 pm
Interressant ton bout de code, le pourcentage c'est un modulo c'est ca ?
C'est le reste de la division ?
Titre: Re : Help iterator
Posté par: Laurent le Octobre 08, 2013, 06:56:50 pm
C'est ça.