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

SL & STL C++ Discussion :

rendre une std::list circulaire


Sujet :

SL & STL C++

  1. #1
    Membre actif Avatar de SKone
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 333
    Points : 250
    Points
    250
    Par défaut rendre une std::list circulaire
    Bonjour,
    En travaillant sur un des points de la génération de ville je suis tombé sur un problème vraiment basique que je n'arrive pas à résoudre.
    Je ne comprend vraiment pas pourquoi cela ne fonctionne pas pourtant rien de bien compliqué normalement.
    J'ai une liste qui représente un polygone convexe ou concave ce n'est pas important mais une liste de point représente un ensemble de segment et je veux parcourir tous les segments donc les points consécutifs 2 à 2 et et c'est simple théoriquement j'ai 2 itérateurs dont un en avance d'un cran sur l'autre. Je quitte mon do while quand le premier itérateur est a end(). Et si celui en avance est à end() je le fais pointé sur begin :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    glBegin(GL_LINES);
    it0 = it1 = il.data.begin();
    it1++;
    do
    {
    	glVertex3f(it0->x - DX, 0.0f, it0->z - DZ);
    	glVertex3f(it1->x - DX, 0.0f, it1->z - DZ);
    	it0++;
    	if (it1 != il.data.end())
    		it1++;
    	else
    		it1 = il.data.begin();
    } while (it0 != il.data.end());
    glEnd();

    Mais lorsque je fais celà le dernier segment me donne la première valeur bonne et la seconde aléatoire mais pas la première valeur de ma liste.
    Ou me suis-je trompé ?

    PS : il contient data qui est une liste de fvector2d qui contient en autre 2 float x et z.

    Merci

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    Il me semble que tu devrais d'abord incrémenter it1 puis le passer à begin s'il est en fin de liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    it0 = it1 = il.data.begin();
    while (it0 != il.data.end())
    {
            ++it1;
    	if (it1 == il.data.end())
    		it1 = il.data.begin();
    	glVertex3f(it0->x - DX, 0.0f, it0->z - DZ);
    	glVertex3f(it1->x - DX, 0.0f, it1->z - DZ);
    	++it0;
    }

  3. #3
    Membre actif Avatar de SKone
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 333
    Points : 250
    Points
    250
    Par défaut
    Merci

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Penses à

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Comme le précise 3DArchi, ++it est plus efficace que it++ : pas de recopie inutile.

  6. #6
    Membre actif Avatar de SKone
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 333
    Points : 250
    Points
    250
    Par défaut
    Ok merci j'oublie toujours le [résolu]
    Et j'ai pris par habitude laissé le compilateur optimisé. Mais je ne suis pas sur qu'il le fasse pour les types non interne au langage comme les itérateurs...

  7. #7
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Là c'est pas une question du compilateur, il peut rien y faire il fait ce que tu lui demandes et en l'occurence la version post et la version préfixée ne font pas exactement la même chose.
    La version postfixée te renvoie une copie et est donc plus lourde.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  8. #8
    Membre actif Avatar de SKone
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 333
    Points : 250
    Points
    250
    Par défaut
    Oui je sais mais comme d'habitude typiquement dans un for (i = 0; i < K; i++) ou ++i rend au même sauf que le compilateur choisit l'un plutôt que l'autre.
    Bref en tout cas le problème est résolu et ne se posera plus

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 68
    Points : 75
    Points
    75
    Par défaut
    En modifiant le type de primitive en GL_LINE_LOOP, tu peux supprimer le test de l'itérateur en fin de liste. C'est OpenGL qui fera le boulot de bouclage sur le premier point.

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

Discussions similaires

  1. Création de mutex ou section critique associés à une STD::LIST
    Par lika_lika dans le forum Threads & Processus
    Réponses: 0
    Dernier message: 05/11/2010, 17h23
  2. sort() d'une std::list en utilisant l'opérateur <
    Par yuukuari dans le forum SL & STL
    Réponses: 8
    Dernier message: 04/12/2008, 14h42
  3. Réponses: 5
    Dernier message: 23/09/2008, 13h29
  4. Recherche dans une std::list et suppression.
    Par Nyko17 dans le forum SL & STL
    Réponses: 5
    Dernier message: 02/05/2008, 12h53
  5. [cast] dans le cas d'une Std::list
    Par ZaaN dans le forum SL & STL
    Réponses: 9
    Dernier message: 26/10/2006, 10h07

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