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 :

Petit problème avec un for


Sujet :

C

  1. #1
    Membre régulier Avatar de lXT95l
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 106
    Points : 116
    Points
    116
    Par défaut Petit problème avec un for
    Bonjour a tous,
    je me retrouves devant un problème que je ne comprend absolument pas.


    J'ai 2 codes similaires, qui pour moi, devraient donner le même résultat.
    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
     
            int i, j;
            for(i=0; i<_mesh->nEdges; i++)
            {
                    if(_mesh->edges[i]->id == _edge->id)
                    {
                    	j=i;
                            free(_mesh->edges[i]);
                            break;
                    }
            }
     
            for(i=j; i<_mesh->nEdges-1; i++)
            {
                    _mesh->edges[i] = _mesh->edges[i+1];
            }
            _mesh->nEdges--;
    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
     
            int i, j;
            for(i=0; i<_mesh->nEdges; i++)
            {
                    if(_mesh->edges[i]->id == _edge->id)
                    {
                            free(_mesh->edges[i]);
                            break;
                    }
            }
     
            for(j=i; j<_mesh->nEdges-1; j++)
            {
                    _mesh->edges[j] = _mesh->edges[j+1];
            }
            _mesh->nEdges--;
    Pour moi, le deuxième code utilise le break pour sortir du for, i devrait être de la même valeur que id, c'est la seule différence. Il semble bien avoir la même valeur que id (ce qui me parait logique), mais le résultat de l'utilisation de ce bout de code me donne des choses totalement différentes..

    Une idée ?

    Merci d'avance
    #opengl@irc.epiknet.net

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lXT95l Voir le message
    Pour moi, le deuxième code utilise le break pour sortir du for, i devrait être de la même valeur que id, c'est la seule différence. Il semble bien avoir la même valeur que id (ce qui me parait logique), mais le résultat de l'utilisation de ce bout de code me donne des choses totalement différentes..
    Bonjour
    Ce n'est pas le break qui fait la différence (il y est dans les deux codes). Dans le premier code, j prend la valeur de sortie pour que i puisse partir de cette valeur et continuer jusqu'à la fin. Dans le second code (qui est déjà plus propre), c'est j qui fait l'itération et qui part alors du i de sortie pour continuer jusqu'à la fin. Dans les deux cas, la seconde boucle traite exactement les mêmes valeurs... à condition que le test ait été vrai au-moins une fois !!!
    Parce que si le test ne se fait pas, dans le premier code j n'est pas initialisé et la seconde boucle part de n'importe-où... et dans le second code, j part de la dernière valeur de i et la seconde boucle ne se fait pas (ce qui est d'ailleurs plus normal dans ce cas là)

    Citation Envoyé par lXT95l Voir le message
    Une idée ?
    Utiliser une 3° écriture encore plus propre

    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
            int i, j;
            for(i=0; i<_mesh->nEdges; i++)
            {
                    if(_mesh->edges[i]->id == _edge->id)
                    {
                        free(_mesh->edges[i]);
                        for(j=i; j<_mesh->nEdges-1; j++)
                       {
                                _mesh->edges[j] = _mesh->edges[j+1];
                       }
                       _mesh->nEdges--;
                       break;
                   }
            }
    Pourquoi "plus propre" ? Parce que visiblement le décalage ne doit se faire que si le test aura été réalisé donc il semble plus logique d'écrire le décalage dans le test. Et on peut même enlever le break auquel cas le décalage se fera pour chaque valeur qui aurait pu correspondre à la valeur attendue (chose que ne fait aucun de tes deux exemples). Et si la valeur n'est pas trouvée, alors le décalage ne se fait pas ce qui correspond toujours au comportement attendu.

    Tu peux passer ta discussion en "résolu" (ben non, elle l'est déjà !!!)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. [MySQL] petit problème avec le (for et while)
    Par kazylax dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 16/09/2009, 10h22
  2. Un petit problème avec pop
    Par Paulinho dans le forum C++
    Réponses: 4
    Dernier message: 13/11/2005, 20h57
  3. Petit problème avec Line Input
    Par GrosQuicK dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/09/2005, 12h47
  4. (Petit ?) problème avec une page contenant du Flash
    Par ologram dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 01/09/2005, 18h45
  5. Petit problème avec SDL
    Par Nyarlathotep dans le forum C
    Réponses: 10
    Dernier message: 01/07/2005, 09h10

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